C++之路进阶——AC自动机(单词)
2016-01-22 11:28
429 查看
F.A.Qs | Home | Discuss | ProblemSet | Status | Ranklist | Contest | ModifyUser hyxzc | Logout | 捐赠本站 |
---|
3172: [Tjoi2013]单词
Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2218 Solved: 1033
[Submit][Status][Discuss]
Description
某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次。Input
第一个一个整数N,表示有多少个单词,接下来N行每行一个单词。每个单词由小写字母组成,N<=200,单词长度不超过10^6Output
输出N个整数,第i行的数字表示第i个单词在文章中出现了多少次。Sample Input
3a
aa
aaa
Sample Output
63
1
HINT
Source
题解:只是裸题而已.....
初步使用结构体算法。。。
hzwer伴我成长
代码:
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; int n,pos[1000005]; struct acm { int sz,point[1000005],q[1000005],sum[1000005],a[1000005][26]; char ch[1000005]; acm() {sz=1;for (int i=1;i<=26;i++) a[0][i]=1;} void insert(int &pos) { scanf("%s",ch); int now=1; for (int i=0;i<strlen(ch);i++) { int t=ch[i]-'a'+1; if (a[now][t]) now=a[now][t]; else now=a[now][t]=++sz; sum[now]++; } pos=now; } void acmach() { int w=1,t=0; point[1]=0,q[0]=1; while (t<w) { int now=q[t++]; for (int i=1;i<=26;i++) { if (!a[now][i]) continue; int k=point[now]; while (!a[k][i])k=point[k]; point[a[now][i]]=a[k][i]; q[w++]=a[now][i]; } } for (int i=t-1;i>=0;i--) { sum[point[q[i]]]+=sum[q[i]]; } } }acm; int main() { scanf("%d",&n); for (int i=1;i<=n;i++) acm.insert(pos[i]); acm.acmach(); for (int i=1;i<=n;i++) printf("%d\n",acm.sum[pos[i]]); }
相关文章推荐
- C++Primer第五版 12.1.6节练习
- C++ IO基础
- C++ static专区
- C语言域名解析的简单实现
- C语言域名解析的简单实现
- C语言域名解析的简单实现
- c语言之c预处理程序
- c语言学习之函数篇
- 字符串匹配
- C++:标准库类型(string、vector、bitset)
- C++静态数据成员存在的意义
- C++ template —— 模板中的名称(三)
- C++中Delete时堆错误(Heap Corruption)的原因
- C++学习 【4.1】 利用函数实现指定的功能---函数,函数的形式,函数参数
- VC++ 引用
- C语言指针5分钟教程
- C++使用STL::vector删除数组内的重复元素
- C++ namespace的用法
- c++11新特性
- C++之路进阶——AC自动机(文本生成器)