http://www.lydsy.com/JudgeOnline/problem.php?id=4567

贪心。

任何不用第一种情况的方案吃的泡椒数都小于\(n^2\),所以最小泡椒数的方案一定不包含第一种情况。

根据第二三种情况,正确的方案一定满足:一个字符串的所有后缀一定比它在表中先出现。

所以可以对所有串建AC自动机,利用fail指针的后缀关系建出一棵树,树上的除了根外的每个点代表每个单词,根节点代表空单词。

转化成了一个新问题:一棵n+1个节点的数,根节点编号为0,剩下的n个节点要分别编号为1~n,满足一个节点的编号比它父亲的编号小,要最小化\(\sum\limits_{u\neq root}(id(u)-id(fa(u)))\)。

这也是一个贪心。

直观地,每个子树内的点的编号一定是连续的,相当于一种dfs的顺序。

对于一个子树的根r,r的所有孩子的dfs的顺序怎么确定?按r的孩子为根的子树大小排序就可以确定dfs顺序了。(直接用排序不等式证明——reflash)



时间复杂度\(O(|len|+n\log n)\)。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 510003; int n, ch[N][26], tot = 1, end[N], qu[N], fail[N], fail_far[N]; void insert(char *s) {
int len = strlen(s), x, tmp = 1;
for (int i = 0; i < len; ++i) {
x = s[i] - 'a';
if (ch[tmp][x]) tmp = ch[tmp][x];
else tmp = ch[tmp][x] = ++tot;
}
end[tmp] = 1;
} struct node {int nxt, to;} E[N];
int cnt = 0, point[N], sz[N];
void ins(int u, int v) {E[++cnt] = (node) {point[u], v}; point[u] = cnt;} void BFS() {
int p = 0, q = 1, f, u, v; qu[1] = 1; fail_far[1] = 1;
while (p != q) {
u = qu[++p];
for (int i = 0; i < 26; ++i)
if (v = ch[u][i]) {
f = fail[u];
while (f && ch[f][i] == 0) f = fail[f];
fail[v] = f ? ch[f][i] : 1;
if (end[v]) ins(fail_far[fail[v]], v);
fail_far[v] = end[v] ? v : fail_far[fail[v]];
qu[++q] = v;
}
}
} ll ans = 0;
char s[N];
int a[N], nn;
bool cmp(int x, int y) {return sz[x] < sz[y];} int dfs(int x) {
sz[x] = 1;
for (int i = point[x]; i; i = E[i].nxt) {
int v = E[i].to;
dfs(v);
sz[x] += sz[v];
} nn = 0;
for (int i = point[x]; i; i = E[i].nxt)
a[++nn] = E[i].to;
stable_sort(a + 1, a + nn + 1, cmp);
int sum = 1;
for (int i = 1; i <= nn; ++i)
ans += sum, sum += sz[a[i]];
} int main() {
scanf("%d", &n);
int len;
for (int i = 1; i <= n; ++i) {
scanf("%s", s);
insert(s);
}
BFS();
dfs(1);
printf("%lld\n", ans);
return 0;
}

【BZOJ 4567】【SCOI 2016】背单词的更多相关文章

  1. [SCOI 2016]背单词

    Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计 ...

  2. bzoj 4568 [SCOI 2016] 幸运数字

    题目大意 给定一棵\(n\)个点的树,每个点有权值 \(q\)次询问树上路径中 每个点权值可选可不选的最大异或和 \(n\le 2*10^4,q\le 2*10^5,val[i]\le 2^{60}\ ...

  3. 4567: [Scoi2016]背单词

    4567: [Scoi2016]背单词 https://www.lydsy.com/JudgeOnline/problem.php?id=4567 题意: 题意看了好久,最后在其他人的博客里看懂了的. ...

  4. BZOJ4567[Scoi2016]背单词

    4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 304 Solved: 114 [Submit][Status] ...

  5. 【bzoj4567】[Scoi2016]背单词

    4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1123 Solved: 476[Submit][Status][ ...

  6. 做中学(Learning by Doing)之背单词-扇贝网推荐

    做中学(Learning by Doing)之背单词-扇贝网推荐 看完杨贵福老师(博客,知乎专栏,豆瓣)的「继续背单词,8个月过去了」,我就有写这篇文章的冲动了,杨老师说: 有时候我会感觉非常后悔,如 ...

  7. “我爱背单词”beta版发布与使用说明

    我爱背单词BETA版本发布 第二轮迭代终于画上圆满句号,我们的“我爱背单词”beta版本已经发布. Beta版本说明 项目名称 我爱背单词 版本 Beta版 团队名称 北京航空航天大学计算机学院  拒 ...

  8. 《我爱背单词》 Alpha版 发布说明

    ——发布地址(baidu网盘) http://pan.baidu.com/s/15omtB ——简介  <我爱背单词>是一款英语单词记忆和管理辅助软件,旨在帮助广大考生在短期内攻克GRE. ...

  9. [No000057]一个人默默背单词,小心被传染哦

    不日凛冬将至,全国各地,已有多名少侠因季节变化,出现了不同程度的四肢不勤.bd不分的症状.具体表现为—— 包大人在此高能预警:不想背单词,有可能你已经被传染了. 好好的,怎么突然不想背单词了 哈佛医学 ...

  10. [No000014]听说不背单词,考英语会是这种下场-我们为什么必须背单词?

    由于英语对于一个程序员来说,重要性你懂得.因此我会开始逐渐在博客上加入英语的一些东西. 听说不背单词,考英语会是这种下场 在中国, 「学英语」大抵遵循着这样一条 罗蒙诺索夫质量守恒定律 因为英语学着学 ...

随机推荐

  1. 【BZOJ】1635: [Usaco2007 Jan]Tallest Cow 最高的牛

    [题意]n头牛,其中最高h.给定r组关系a和b,要求满足h[b]>=h[a]且a.b之间都小于min(h[a],h[b]),求第i头牛可能的最高高度. [算法]差分 [题解]容易发现r组关系只能 ...

  2. 【BZOJ】2054: 疯狂的馒头

    [题意]给定n个元素,m次给一段区间染色为i,求最终颜色. [算法]并查集 [题解]因为一个点只受最后一次染色影响,所以倒过来每次将染色区间用并查集合并,父亲指向最右边的点. 细节: 1.fa[n+1 ...

  3. Spring与MyBatis的整合(山东数漫江湖)

    首先看一下项目结构图: 具体步骤如下: 1.建立JDBC属性文件 jdbc.properties (文件编码修改为 utf-8 ) driver=com.mysql.jdbc.Driver url=j ...

  4. vs 2015 插件 supercharger 破解方式

    亲测有效:效果如图 方法如下: 1.打开Supercharger的options; 2.点击Pricing & Registration 3.复制 license  然后再按Paste &am ...

  5. 学习 Linux,101: 自定义或编写简单脚本【转】

    转自:http://www.ibm.com/developerworks/cn/linux/l-lpic1-105-2/index.html 学习如何使用标准的 shell 语法.循环和控制结构,以及 ...

  6. Mongo 配置文件 [www]

    Mongo 配置文件  [www] http://blog.chinaunix.net/uid-25206403-id-3510934.html mongodb 安装使用 http://blog.si ...

  7. Oracle 合并 merger into

    merge into copy_emp1 c  using employees e  on (c.employee_id=e.employee_id)when matched then  update ...

  8. 10 个打造 React.js App 的最佳 UI 框架

    10 个打造 React.js App 的最佳 UI 框架 在本文中,我们将分享一些助你打造 React.js App 最佳的 UI 框架.它们具备你所需要的基本 React 组件,以及易用的 API ...

  9. PHP的数据类型

      原始类型共8种: 1,  4种标量类型:boolean(布尔型).integer(整形).float/double(浮点型).string(字符串型): 2,  2种复合型:array(数组).o ...

  10. 让IE6支持css3,让 IE7、IE8 都支持CSS3

    但凡是前端工程师,都知道IE6,IE7,IE8不支持.或者不完全支持CSS3的属性. CSS3 有很多很强大.绚丽的效果,比如,圆角,阴影,渐变透明,渐变背景,等等. 因为IE6时代,没有什么标准,而 ...