Michael_Bryant最喜欢的G(al)G(ame)

那些悲伤,那些寂寞,那些几乎让自己放弃生活的希望的痛苦的回忆,绝对绝对不要将它们忘记。

Michael_Bryant最喜欢的番剧

抱歉⋯我已经绝对不可能再获得幸福了,因为⋯我发现⋯ 其实我⋯ 早就已经被幸福包围了

Michael_Bryant正在看的番剧

死亡一点也不温柔,只有无尽的黑暗和孤独。 就算联系得再紧密,人也是孤独的。

bzoj 3172: [Tjoi2013]单词

写在前面

说好的是AC自动机习题
结果他们都说这题连后缀数组都卡
我自认为写的是AC自动机
其实。。。

题目链接

传送门

Description

某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次。

Input

第一个一个整数N,表示有多少个单词,接下来N行每行一个单词。每个单词由小写字母组成,N<=200,单词长度不超过10^6

Output

输出N个整数,第i行的数字表示第i个单词在文章中出现了多少次。

Sample Input

3

a

aa

aaa

Sample Output

6

3

1

自以为是的样例讲解

a——a中出现一次 aa中出现两次 aaa中出现三次
aa——aa中出现一次 aaa中出现两次
aaa——aaa中出现一次

想说的话

刚刚自学完AC自动机
想用来练手
结果。。。。。。
练手变成了烧脑

题解

朴素算法当然是用“#”插在中间跑kmp
你不TLE才怪
先构建TRIE树
然后用好你的fail指针
在这个树上面 采用类似于fail树的东西
对于每个字符串出现的次数
是结束节点fail子树的权值和
再额外用一个小数组记录每个单词结束的节点是第几个
用手写队列入队顺序的反序
把权值加出来
就哦多尅了

代码

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注

隐藏