AC自动机裸题
1 5 6 orz sto kirigiri danganronpa ooooo o kyouko dangan ronpa ooooo ooooo
1 1 0 3 7
/* *********************************************** Author :CKboss Created Time :2015年08月13日 星期四 13时55分22秒 File Name :1005.cpp ************************************************ */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <cmath> #include <cstdlib> #include <vector> #include <queue> #include <set> #include <map> using namespace std; typedef long long int LL; const int maxn=110100; int ch[maxn][26],fail[maxn]; LL End[maxn]; int root,sz; int newnode() { memset(ch[sz],-1,sizeof(ch[sz])); End[sz++]=0; return sz-1; } void init() { sz=0; root=newnode(); } void insert(const char str[]) { int len=strlen(str); int now=root; for(int i=0;i<len;i++) { int& temp=ch[now][str[i]-'a']; if(temp==-1) temp=newnode(); now=temp; } End[now]++; } void build() { queue<int> q; fail[root]=root; for(int i=0;i<26;i++) { int &temp=ch[root][i]; if(temp==-1) temp=root; else { fail[temp]=root; q.push(temp); } } while(!q.empty()) { int now=q.front(); q.pop(); for(int i=0;i<26;i++) { if(ch[now][i]==-1) { ch[now][i]=ch[fail[now]][i]; } else { fail[ch[now][i]]=ch[fail[now]][i]; q.push(ch[now][i]); } } } } LL query(const char str[]) { int len=strlen(str); int now=root; LL ret=0; for(int i=0;i<len;i++) { now=ch[now][str[i]-'a']; int temp=now; while(temp!=root) { ret+=End[temp]; temp=fail[temp]; } } return ret; } int n,m; string Ts[maxn],Tp[maxn]; int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int T_T; scanf("%d",&T_T); while(T_T--) { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) cin>>Ts[i]; init(); for(int i=0;i<m;i++) { cin>>Tp[i]; insert(Tp[i].c_str()); } build(); for(int i=0;i<n;i++) { LL as=query(Ts[i].c_str()); cout<<as<<endl; } } return 0; }