3172: [Tjoi2013]單詞ios
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 2783 Solved: 1322
[Submit][Status][Discuss]
Descriptionc++
某人讀論文,一篇論文是由許多單詞組成。但他發現一個單詞會在論文中出現不少次,如今想知道每一個單詞分別在論文中出現多少次。spa
Inputcode
第一個一個整數N,表示有多少個單詞,接下來N行每行一個單詞。每一個單詞由小寫字母組成,N<=200,單詞長度不超過10^6ip
Outputget
輸出N個整數,第i行的數字表示第i個單詞在文章中出現了多少次。string
Sample Inputit
3io
aclass
aa
aaa
Sample Output
6
3
1
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<algorithm> #include<queue> using namespace std; #define LL long long int read() { int s=0,f=1;char ch=getchar(); while(!('0'<=ch&&ch<='9')){if(ch=='-')f=-1;ch=getchar();} while('0'<=ch&&ch<='9'){s=(s<<3)+(s<<1)+ch-'0';ch=getchar();} return s*f; } int n,np; int ch[1000006][26],fail[1000006]; char z[1000006]; queue<int>q; int siz[1000006]; int bfn[1000006]; int end[205]; int main() { //freopen(".in","r",stdin); //freopen(".out","w",stdout); n=read(); for(int i=1;i<=n;i++) {scanf("%s",z+1); int l=strlen(z+1),x=0; for(int j=1;j<=l;j++) {if(!ch[x][z[j]-'a']) ch[x][z[j]-'a']=++np; x=ch[x][z[j]-'a']; siz[x]++; } end[i]=x; } for(q.push(0);!q.empty();) {int u=q.front();q.pop(); bfn[++bfn[0]]=u; for(int i=0;i<26;i++) {int &v=ch[u][i]; if(!v) {v=ch[fail[u]][i]; continue; } if(u)fail[v]=ch[fail[u]][i]; q.push(v); } } for(int i=bfn[0];i;i--) siz[fail[bfn[i]]]+=siz[bfn[i]]; for(int i=1;i<=n;i++) printf("%d\n",siz[end[i]]); //fclose(stdin); //fclose(stdout); return 0; }