[TJOI2013]单词
2016-04-08 16:48
267 查看
2755: [TJOI2013]单词
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 6 Solved: 3
[Submit][Status][Web Board]
Description
某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次Input
第一个一个整数N,表示有多少个单词,接下来N行每行一个单词。每个单词由小写字母组成,N<=200,单词长度不超过10^6Output
输出N个整数,第i行的数字表示第i个单词在文章中出现了多少次。Sample Input
3 a aa aaa
Sample Output
6 3 1
HINT
Source
题解:求出fail树以后。。。
对每个串的每个节点打标记
然后输出每个串终点子树的标记个数和
#include<iostream> #include<cstring> #include<cstdio> #define maxn 1000001 using namespace std; int n,tot; int sum[maxn],fai[maxn],son[maxn][27],pos[201],lis[maxn]; char s[maxn]; void insert(int x) { scanf("%s",s+1); int p=0,nn=strlen(s+1); for (int i=1; i<=nn; i++) { if (!son[p][s[i]-'a']) son[p][s[i]-'a']=++tot; p=son[p][s[i]-'a']; sum[p]++; } pos[x]=p; } void failed() { int head=0,tail=1; lis[1]=0; fai[0]=-1; int a; while (head<tail) { int now=lis[++head]; for (int i=0;i<26;i++) { if (son[now][i]) { lis[++tail]=son[now][i]; a=fai[now]; while (a!=-1&&!son[a][i]) a=fai[a]; if (a>=0) fai[son[now][i]]=son[a][i]; else fai[son[now][i]]=0; } } } for (int i=tail; i>=1; i--) sum[fai[lis[i]]]+=sum[lis[i]]; } int main() { cin>>n; tot=0; for (int i=1; i<=n; i++) insert(i); failed(); for (int i=1; i<=n; i++) printf("%d\n",sum[pos[i]]); }
View Code
相关文章推荐
- nodemailer实现node发送邮件
- 应用程序运行时的虚拟内存布局 - 进程 - 线程
- 数字反转
- 83.手势过滤和手势屏蔽
- 你的产品该如何做好?—NPS
- Android ORM框架 greenDao使用
- android项目总结
- const的用法总结
- javascript Prototype constructor的理解(转)
- USB2.0学习笔记连载(十八):keil实现寄存器的配置及相关函数讲解(二)
- iOS学习笔记10-UIView动画
- android 应用退到后台,类似最小化moveTaskToBack(),判断是否是task的根isTaskRoot()
- 礼拜五log~jBox
- Android开发小技巧之对android颜色渐变(Gradient )的改进
- 实现数组作为函数参数传递,切返回值也是数组
- 23种设计模式(java)二
- PHP中命名空间不足之详解
- 『NYIST』第九届河南省ACM竞赛队伍选拔赛[正式赛二]-最小内积(第八届北京师范大学程序设计竞赛决赛)
- linux添加网关和出接口不同网段的路由
- leetcode 53. Maximum Subarray