【bzoj 3172】【codevs 2542】[Tjoi2013]单词(AC自动机)
2016-10-09 20:35
393 查看
3172: [Tjoi2013]单词
Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 3024 Solved: 1441
[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
[Submit][Status][Discuss]
【题解】【AC自动机】
【类似于“病毒持续侵袭中”,也要记录单词的出现位置和结束位置,但不能在最后查找,因为单词出现的次数是从它出现的位置开始算起,即所有单词合成的这篇文章中,处于当前单词之前可能还合成了当前单词,但不计入最后结果】
#include<queue> #include<vector> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; vector<int>loc,order; int n,nxt[1000010][30],fail[1000010],sum[1000010],tot; bool vis[1000010]; inline void clean() { memset(sum,0,sizeof(sum)); memset(fail,0,sizeof(fail)); memset(nxt,0,sizeof(nxt)); memset(vis,false,sizeof(vis)); tot=0; loc.clear(); order.clear(); return; } inline void insert(char c[]) { int len=strlen(c); int now=0,i; for (i=0;i<len;++i) { int x=c[i]-'a'; if (!nxt[now][x]) nxt[now][x]=++tot; sum[nxt[now][x]]++; now=nxt[now][x]; } vis[now]=true;//标记以当前点为结尾的单词出现过 loc.push_back(now);//标记结尾 return; } inline void buildfail() { queue<int>que; int i,j; for(i=0;i<26;++i) if (nxt[0][i]) que.push(nxt[0][i]); while (!que.empty()) { int now=que.front(); que.pop(); order.push_back(now);//把当前出现的单词存起来 for (i=0;i<26;++i) { if (!nxt[now][i]) {nxt[now][i]=nxt[fail[now]][i]; continue;} int x=nxt[now][i]; fail[x]=nxt[fail[now]][i];//fail里存到当前字母为止的单词的最长后缀 que.push(x);//将更新出来的单词存入队列(存的是序号) } } return; } inline void find() { for (int i=order.size()-1;i>=0;--i) sum[fail[order[i]]]+=sum[order[i]]; for (int i=0;i<n;++i) printf("%d\n",sum[loc[i]]); return; } int main() { int i,j; clean(); scanf("%d",&n); for (i=0;i<n;++i) { char s1[1000010]; scanf("%s",s1); insert(s1); } buildfail(); find(); return 0; }
相关文章推荐
- [BZOJ3172][TJOI2013]单词(AC自动机)
- 【BZOJ3172】[Tjoi2013]单词 AC自动机
- 【bzoj3172】 [Tjoi2013]单词 AC自动机
- BZOJ3172 [Tjoi2013]单词(AC自动机+打标记)
- BZOJ 3172: [Tjoi2013]单词 AC自动机
- BZOJ_3172_[TJOI2013]_单词_(AC自动机)
- bzoj 3172: [Tjoi2013]单词 AC自动机
- 【BZOJ】3172: [Tjoi2013]单词(后缀自动机)
- BZOJ 3172 [Tjoi2013]单词 后缀自动机
- [BZOJ]3172: [Tjoi2013]单词 AC自动机(或广义后缀自动机)
- BZOJ 3172 [Tjoi2013]单词 AC自己主动机(fail树)
- bzoj 3172 [Tjoi2013]单词 后缀自动机
- BZOJ 3172: [Tjoi2013]单词 AC自动机/后缀自动机
- BZOJ_P3172 [Tjoi2013]单词(AC自动机)
- BZOJ_3172_[Tjoi2013]单词_后缀自动机
- BZOJ 3172 [Tjoi2013]单词 AC自动机(fail树)
- bzoj 3172 [Tjoi2013]单词(fail树,DP)
- [BZOJ3172][TJOI2013]单词
- BZOJ3172: [Tjoi2013]单词
- [BZOJ 3172] [Tjoi2013] 单词 【AC自动机】