3172: [Tjoi2013]單詞

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;
}
相關文章
相關標籤/搜索