您的位置:首页 > 其它

hdu 5384 Danganronpa

2015-08-14 16:20 337 查看
#include<cstring>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
#define INF 0x3f3f3f3f
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;

typedef long long LL;

const int SIGMA_SIZE=26;
const int MAXN=100010;
const int MAXNODE=600010;
const LL MOD= 258280327;

int T,N,M;
LL ans;
string str1[MAXN],str2[MAXN];

struct AC{
    int ch[MAXNODE][SIGMA_SIZE],f[MAXNODE],sz;
    LL val[MAXNODE];
    void init(){
        memset(ch[0],0,sizeof(ch[0]));
        val[0]=0;
        sz=1;
    }
   inline int idx(char c){
        return c-'a';
    }
    void insert(string s){
        int u=0,len=s.size();
        for(int i=0;i<len;i++){
            int c=idx(s[i]);
            if(!ch[u][c]){
                memset(ch[sz],0,sizeof(ch[sz]));
                val[sz]=0;
                ch[u][c]=sz++;
            }
            u=ch[u][c];
        }
        val[u]++;
    }
    void get_fail(){
        queue<int> q;
        f[0]=0;
        for(int c=0;c<SIGMA_SIZE;c++){
            int u=ch[0][c];
            if(u){
                f[u]=0;
                q.push(u);
            }
        }
        while(!q.empty()){
            int r=q.front();
            q.pop();
            for(int c=0;c<SIGMA_SIZE;c++){
                int u=ch[r][c];
                if(!u){
                    ch[r][c]=ch[f[r]][c];
                    continue;
                }
                q.push(u);
                f[u]=ch[f[r]][c];
                val[u]+=val[f[u]];
            }
        }
    }

    void find(string T){
        int j=0;
        int len=T.size();
        for(int i=0;i<len;i++){
            int c=idx(T[i]);
            j=ch[j][c];
            ans+=val[j];
        }
    }
}ac;

int main(){
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    freopen("out.txt", "w", stdout);
    #endif // ONLINE_JUDGE

    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&N,&M);
        for(int i=1;i<=N;i++) cin>>str1[i];
        for(int i=1;i<=M;i++) cin>>str2[i];
        ac.init();
        for(int i=1;i<=M;i++) ac.insert(str2[i]);
        ac.get_fail();
        for(int i=1;i<=N;i++){
            ans=0;
            ac.find(str1[i]);
            printf("%I64d\n",ans);
        }
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: