3172: [Tjoi2013]单词

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 3246  Solved: 1565
[Submit][Status][Discuss]

Description

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

Input

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

Output

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

Sample Input

3
a
aa
aaa

Sample Output

6
3
1

HINT

 

Source

在构建trie树时,统计每个节点出现的次数。
AC自动机实现:从前向后倒推,用一个单词的后缀的次数来更新前缀的次数。

/*fail树.(摘自yjy)
一开始没想出用AC自动机怎么做.
原来是fail树处理.
因为fail指针有一个很好的性质
就是某个字串的后缀等于fail指向位置的前缀.
那么显然的p的深度 > p->fail .
我们bfs的时候有一个已经处理好的深度关系.
那么我们倒序相加把贡献转移给文章中给定的前缀串就好了.
那么某个字符串答案的贡献就来源于两部分.
case 1:与该串前缀相同的字串个数.
case 2:与该串前缀不同的字串个数.
对于case 1,我们可以在建trie的时候直接算出来.
case 2 我们统一把贡献转移给前缀串.
*/
#include<cstdio>
#include<cstring>
#define Sz 26
using namespace std;
const int N=1e6+,Z=;
int n,cnt=,tr[N][Z],tag[N],fail[N],q[N];
int ans[N],f[N];
char s[N];
void insert(int id){
scanf("%s",s);
int now=,l=strlen(s);
for(int z,i=;i<l;i++){
z=s[i]-'a';
if(!tr[now][z]) tr[now][z]=++cnt;
now=tr[now][z];
ans[now]++;
}
tag[now]++;f[id]=now;
}
void acmach(){
for(int i=;i<Sz;i++) tr[][i]=;
int h=,t=,now=,p;q[t]=;fail[]=;
while(h!=t){
now=q[++h];
for(int i=;i<Sz;i++){
if(!tr[now][i]) continue;
p=fail[now];
while(!tr[p][i]) p=fail[p];
p=tr[p][i];
fail[tr[now][i]]=p;
q[++t]=tr[now][i];
}
}
for(int i=t;i;i--) ans[fail[q[i]]]+=ans[q[i]];
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++) insert(i);
acmach();
for(int i=;i<=n;i++) printf("%d\n",ans[f[i]]);
return ;
}

最新文章

  1. Swift3.0都有哪些变化
  2. Java运算符优先级
  3. 树形DP(Rebuilding Roads poj1947)
  4. Java对象的序列化与反序列化
  5. HDU 1559 最大子矩阵 (DP)
  6. ubuntu apt-get 遇到的问题
  7. 【JDK1.8】JDK1.8集合源码阅读——ArrayList
  8. Html5+CSS3之音视频播放
  9. 克服&quot;水土不服&quot;,融云助攻小象直播杀破&quot;出海重围&quot;
  10. WEB 性能优化导图
  11. 解决JS(Vue)input[type=&#39;file&#39;] change事件无法上传相同文件的问题
  12. 网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP (转)
  13. JSON Web Token – 在 Web 应用间安全地传递信息
  14. selenium-python:登录网站并签到
  15. CentOS7启动流程
  16. ictclas bug修复
  17. Scrapy 增加随机请求头 user_agent
  18. 路由协议RIP、EIGRP、OSPF
  19. hdu 3371(prim算法)
  20. 开源管理系统OSSIM设置 语言为中文简体

热门文章

  1. php 使用htmlspecialchars() 和strip_tags函数过滤HTML标签的区别
  2. Singleton(单例模式)
  3. Bootstrap组件之响应式导航条
  4. JavaScript数组的reduce方法详解
  5. javascript每天一题
  6. VMware VirtualBox共存时桥接注意
  7. iOS项目groups和folder的区别(组和文件夹)
  8. 初学HTML 常见的标签(三) 插入类标签
  9. vim中tab转为空格
  10. Linux监控工具介绍系列&mdash;&mdash;smem