4567: [Scoi2016]背单词

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 271  Solved: 103
[Submit][Status][Discuss]

Description

Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”。这时候睿智
的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的:
—————
序号  单词
—————
1
2
……
n-2
n-1
n
—————
然后凤老师告诉 Lweb ,我知道你要学习的单词总共有 n 个,现在我们从上往下完成计划表,对于一个序号为 x 
的单词(序号 1...x-1 都已经被填入):
1) 如果存在一个单词是它的后缀,并且当前没有被填入表内,那他需要吃 n×n 颗泡椒才能学会;
2) 当它的所有后缀都被填入表内的情况下,如果在 1...x-1 的位置上的单词都不是它的后缀,那么你吃 x 颗泡
椒就能记住它;
3) 当它的所有后缀都被填入表内的情况下,如果 1...x-1的位置上存在是它后缀的单词,所有是它后缀的单词中
,序号最大为 y ,那么你只要吃 x-y 颗泡椒就能把它记住。
Lweb 是一个吃到辣辣的东西会暴走的奇怪小朋友,所以请你帮助 Lweb ,寻找一种最优的填写单词方案,使得他
记住这 n 个单词的情况下,吃最少的泡椒。

Input

输入一个整数 n ,表示 Lweb 要学习的单词数。接下来 n 行,每行有一个单词(由小写字母构成,且保证任意单
词两两互不相同)1≤n≤100000, 所有字符的长度总和 1≤|len|≤510000

Output

Lweb 吃的最少泡椒数

Sample Input

2
a
ba

Sample Output

2

Trie树+贪心

出题人的语文水平真的有待提高...反反复复看了N遍才理解题意…

第一种情况的花费是n*n,所以一定不能出现第一种情况,即如果a是b的后缀,a一定要在b前面出现。

然后可以发现所有字符串的后缀关系形成一个树状结构,这显而易见。我们把所有字符串逆向插入Trie树中,然后DFS一遍,就可以得出这个后缀关系。

于是问题转化为求一棵树的拓扑序,满足每一个点的编号减去它父亲编号的和最小。

这满足贪心策略,每次走最小的子树,求出DFS序即可。

#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#define F(i,j,n) for(int i=j;i<=n;i++)
#define D(i,j,n) for(int i=j;i>=n;i--)
#define ll long long
#define pa pair<int,int>
#define N 100005
#define M 520005
using namespace std;
int n,tot=1,cnt,a[M][26],id[M],fa[N],head[N],sz[N],f[N];
ll ans;
char s[M];
struct edge{int next,to;}e[N];
vector<pa> v[N];
void add_edge(int x,int y)
{e[++cnt]=(edge){head[x],y};head[x]=cnt;fa[y]=x;
}
void dfs(int x,int f)
{if (id[x]) add_edge(f,id[x]),f=id[x];F(i,0,25) if (a[x][i]) dfs(a[x][i],f);
}
void getsz(int x)
{sz[x]=1;for(int i=head[x];i;i=e[i].next){int y=e[i].to;getsz(y);v[x].push_back(make_pair(sz[y],y));sz[x]+=sz[y];}sort(v[x].begin(),v[x].end());
}
void getf(int x)
{if (x) f[x]=++tot;for(int i=0;i<v[x].size();i++) getf(v[x][i].second);
}
int main()
{scanf("%d",&n);F(i,1,n){scanf("%s",s+1);int len=strlen(s+1),now=1,x;D(j,len,1){x=s[j]-'a';if (!a[now][x]) a[now][x]=++tot;now=a[now][x];}id[now]=i;}dfs(1,0);getsz(0);tot=0;getf(0);F(i,1,n) ans+=f[i]-f[fa[i]];cout<<ans<<endl;return 0;
}

bzoj4567【SCOI2016】背单词相关推荐

  1. BZOJ4567 SCOI2016背单词(trie+贪心)

    倒过来变成查询前缀.考虑怎么排序.第一条代价n*n就相当于inf,说明一个单词的所有前缀都要排在它前面.那么串的依赖关系就是trie的结构.二三条说明代价是Σidi-idfa,那么显然最后的编号应该是 ...

  2. 【bzoj4567】[Scoi2016]背单词 贪心+trie树

    我个傻逼,这么水的题还调了那么久. 把所有的串都反过来,建trie树,很明显,不同子树间是不影响的. 一定是先选择父亲节点再选子节点,同一个节点先选子树大小最小的儿子即可. 一开始想错了,以为可以直接 ...

  3. [Scoi2016]背单词[字典树+dfs重构树[类似虚树]]

    解题思路:很明显第一个条件是可以避免的,第二个条件是第三个条件的特殊情况,所以有用的只有第三个条件,现在我们就是想将这些单词重排使得每个单词后缀都在这个单词的前面并且代价最小 我们举个例子: 6 a ...

  4. BZOJ 4567 [SCOI2016]背单词 (Trie树、贪心)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4567 题解: 显然答案一定小于\(n\times n\), 字符串倒过来变成前缀建Tr ...

  5. 【青少年编程】黄羽恒:我要背单词

    「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复[Scratch]或[Python],即可进入.如果加入了之前的社群不需要重复加入. 微信后台回复"资料下载&quo ...

  6. 不用“背”单词,一个方法从普通二本到哥伦比亚大学:我是如何做到的?

    "学英语太难.太费劲了."我听过无数人这么说. 然而,我的学员们,却都只用了短短3-6个月时间,就以惊人速度提高了英语: 小磊:勉强踩着2本线上了大学,四级考了3次没过,毕业时却拿 ...

  7. 别光顾着背单词了,每天花18分钟做这件事,英语水平暴增!

    在知乎上看过一个问题:在当今社会,英语还重要吗? 点赞第一的回答是-- 英语可以差,但你的口语一定要好! 你记住了1万个单词.将语法书倒背如流.英语成绩名列前茅.英语证书一大摞. 但你的口语差,看见老 ...

  8. 少壮不努力,老大背单词

    少壮不努力,老大背单词 你必须非常努力,才可以看起来毫不费力 uncouth (adj.) 粗鲁的,不文明的 I am embarrassed by your uncouth manners epit ...

  9. 微信背单词类小程序,小鸡单词源码下载,打卡微信小程序

    微信背单词类小程序,小鸡单词源码下载,微信小程序开发学习案例,小程序开发教程.一个用来背单词每天打卡的微信小程序,还有词汇测试,包含多种词库后台由腾讯云wafer解决方案. 前段时间开始学做微信小程序 ...

  10. python写背单词软件_python背单词小程序

    import random as t #创建单词序列 words=("easy","difficult","answer","co ...

最新文章

  1. python搭建简单http文件服务器
  2. Arrays.sort()源码分析
  3. 计算机原理存储器实验报告,计算机组成原理存储器实验报告.doc
  4. 其它综合-CentOS7 忘记root密码
  5. Python_自定义关键字的使用
  6. c语言中 flag.bit7,利用proteus学习ARM(LPC2103)之二:熟悉IAR C语言开发环境
  7. 深入理解 MySQL—锁、事务与并发控制
  8. python合并excel工作簿_使用Python将多个excel的多个sheet页合并到一个excel
  9. python协同过滤算法_协同过滤算法介绍及算法实现
  10. 计算机专业内卷严重,考研,这6个专业“内卷”严重,竞争较为激烈!
  11. linux 必知命令
  12. JavaScript:get和post的区别
  13. 百度输入法黑莓版更新至1.0.1.7
  14. java毕业设计宠物领养饲养交流管理平台Mybatis+系统+数据库+调试部署
  15. 转型不忘初心,决定一个高端存储厂商的未来
  16. PnPUtil (PnPUtil.exe) 是一个命令行工具,使管理员可以执行以下操作驱动程序包
  17. 首批小程序出炉,小游戏?
  18. 基于Spark的巨型矩阵分布式LU计算求逆【第一篇】
  19. GUID [xxx] for asset ‘Packages/com.unity.plasticscm-cn/Editor/xxx/xxx‘ conflicts with: ‘Packages/com
  20. 过去一周最吸引眼球的10大科技产品或技术

热门文章

  1. 如何制作3D动画人物
  2. python dict key类型_Python——dict(自定义类作key)
  3. 计算机存储盘设置密码,如何在USB驱动器上设置密码并教您如何设置
  4. 通过两个列表构建字典_我在两个月内以99美元的价格构建了一个电子商务网站!
  5. Python爬虫入门教程: 半次元COS图爬取
  6. uniapp中使用原生方式写页面头部,存在多级页面时,当点击返回图标按钮时,父页面的返回按钮消失了(已解决)
  7. 数据库kettle,datax,DBMigration,RazorSQL几款迁移工具使用感受(以及如何迁移表的结构如主键,索引,约束等)
  8. dxdiag 的使用
  9. 修复windows系统引导
  10. Unix与Linux、Minx、Minix