标签:
#include<cstdio> #include<queue> #include<string> #include<map> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; const int N=1e6+5; const int sigma_size=26; const int max_node=500050; char text[N],p[10005][55]; bool vis[max_node]; int ans; struct AhoCorasickAutomata { int ch[max_node][sigma_size]; int val[max_node],last[max_node],f[max_node],cnt[max_node]; int sz; inline void init() { sz=1; memset(ch[0],0,sizeof(ch[0])); memset(cnt,0,sizeof(cnt)); } inline void Count(int j){if(j&&!vis[j])vis[j]=1,ans+=cnt[j],Count(last[j]);} inline int idx(char c){return c-‘a‘;} void Insert(char *s,int v) { int u=0,len=strlen(s); 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]=v; cnt[u]++; } void Getfail() { queue<int>q; f[0]=0; for(int i=0;i<sigma_size;i++) { int u=ch[0][i]; if(u){f[u]=0;q.push(u);last[u]=0;} } while(!q.empty()) { int r=q.front();q.pop(); for(int i=0;i<sigma_size;i++) { int u=ch[r][i]; if(!u){ch[r][i]=ch[f[r]][i];continue;} q.push(u); int v=f[r]; while(v&&!ch[v][i])v=f[v]; f[u]=ch[v][i]; last[u]=(val[f[u]]?f[u]:last[f[u]]); } } } void Find(char* s) { for(int i=0,j=0,len=strlen(s);i<len;i++) { int c=idx(s[i]); j=ch[j][c]; if(val[j])Count(j); else if(last[j])Count(last[j]); } } }ac; int main() { int T; scanf("%d",&T); while(T--) { ans=0; memset(vis,0,sizeof(vis)); ac.init(); int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%s",p[i]),ac.Insert(p[i],i); ac.Getfail(); scanf("%s",text); ac.Find(text); printf("%d\n",ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/homura/p/5758940.html