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】1774: [Usaco2009 Dec]Toll 过路费

    [题意]给定无向图,距离定义为边权和+最大点权,询问若干个两点最短距离.n<=250. [算法]排序+floyd [题解]考虑floyd的过程是每次找一个中转点,为了在当前找到一条新路径时方便地 ...

  2. Spring中获取request的几种方法,及其线程安全性分析(山东数漫江湖)

    前言 本文将介绍在Spring MVC开发的web系统中,获取request对象的几种方法,并讨论其线程安全性. 原创不易,如果觉得文章对你有帮助,欢迎点赞.评论.文章有疏漏之处,欢迎批评指正. 欢迎 ...

  3. 20151024_003_C#基础知识(File / FileStream / StreamReader/StreamWriter)

    1:绝对路径和相对路径 绝对路径:通过给定的路径直接能在我的电脑中找到这个文件. 相对路径:文件相对于应用程序的路径. 2:编码格式 乱码:产生乱码的原因,就是你保存这个文件所采用的编码,跟你打开这个 ...

  4. vue路由-编程式导航

    除了使用 <router-link> 创建 a 标签来定义导航链接,我们还可以借助 router 的实例方法,通过编写代码来实现. router.push(location, onComp ...

  5. Laravel 5.2 三、中间件、视图与 Blade 模板引擎

    一.中间件 Laravel 的 HTTP 中间件提供了对路由的一层过滤和保护.下面模拟一下用中间件验证后台登录. 1. 创建中间件 cmd 窗口进入项目目录,使用 artisan 命令创建 php a ...

  6. expect 实现iterm2自动加载pem登录跳板机

    #!/usr/bin/expect set timeout spawn expect { "connecting (yes/no)?" { send "yes\r&quo ...

  7. Linux下通过jstat命令查看jvm的GC情况

    jstat命令可以查看堆内存各部分的使用量,以及加载类的数量.命令的格式如下: jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]  注意!!!:使用的jdk版本是jdk8. ...

  8. keil问题:Error: failed to execute 'C:\Keil\ARM\BIN\ArmCC'

    1.打开cmd,进入相应的路径下 cd C:\Keil\ARM\BIN\ 输入 armcc  若显示如下界面则说明keil已经注册 2.若注册成功还没解决问题,则说明软件是在网上下载的破解版的,建议卸 ...

  9. linux命令(49):wget命令

    Linux wget是一个下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,尤其对于网络管理员,经常要下载一些软件或从远程服务器恢复备份到本地服务器.如果我们使用虚拟主机,处理这样的 ...

  10. Django Ajax学习一

    1. 简单的加法 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...