structZPK{//AωR2020 txdy int son[26]; int num=0,flag=0; }trie[N]; int tot; inlinevoidinsert(char s[]){ int u=1; for(int i=0;s[i];i++){ int v=s[i]-'a'; if(!trie[u].son[v]) trie[u].son[v]=++tot; u=trie[u].son[v]; } trie[u].num++; }
template <typename T> voidread(T &x){ x=0; char c=getchar(); int f=0; for(; !isdigit(c); c=getchar()) f |= c=='-'; for(; isdigit(c); c=getchar()) x = x*10+(c^48); if(f) x = -x; } template <typename T> voidwrite(T &x,char ch){ if(x<0) putchar('-'), x = -x; staticshort st[30],tp; do st[++tp] = x%10, x/=10; while(x); while(tp) putchar(st[tp--] | 48); putchar(ch); }
structZPK{ int num,fail; int son[30]; }trie[N]; int n,tot; inlinevoidinsert(char s[],int len){ int u=0; for(int i=0;i<len;i++){ int v=s[i]-'a'; if(!trie[u].son[v]) trie[u].son[v]=++tot; u=trie[u].son[v]; } trie[u].num++; }
inlinevoidgetfail(){ for(int i=0;i<26;i++){ if(trie[0].son[i]) q.push(trie[0].son[i]); } while(!q.empty()){ int u=q.front(); q.pop(); for(int i=0;i<26;i++){ int v=trie[u].son[i]; int Fail=trie[u].fail; if(!v) trie[u].son[i]=trie[Fail].son[i]; else trie[v].fail=trie[Fail].son[i],q.push(v); } } }
inlineintquery(char s[],int len){ int u=0,ans=0; for(int i=0;i<len;i++){ int v=s[i]-'a'; int k=trie[u].son[v]; while(k && trie[k].num!=-1){ ans+=trie[k].num; trie[k].num=-1; k=trie[k].fail; } u=trie[u].son[v]; } return ans; }
char s[N];
intmain(){ read(n); for(int i=1;i<=n;i++){ scanf("%s",s); int len=strlen(s); insert(s,len); } getfail(); memset(s,'\0',sizeof(s)); scanf("%s",s); int len=strlen(s); int ans=query(s,len); write(ans,'\n'); return0; }
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<queue> usingnamespace std; constint N=1e6+10; structZPK{ int son[26]; int num,fail; }trie[N]; int tot; int ed[N];
inlinevoidinsert(int now,char c[]){ int u=0,len=strlen(c); for(int i=0;i<len;i++){ int v=c[i]-'a'; if(!trie[u].son[v]) trie[u].son[v]=++tot; u=trie[u].son[v]; } trie[u].num=now; }
inlinevoidgetfail(){ queue<int> q; for(int i=0;i<26;i++) if(trie[0].son[i]) q.push(trie[0].son[i]); while(!q.empty()){ int u=q.front();q.pop(); for(int i=0;i<26;i++){ int v=trie[u].son[i]; int Fail=trie[u].fail; if(!v) trie[u].son[i]=trie[Fail].son[i]; else trie[v].fail=trie[Fail].son[i],q.push(v); } } }
inlinevoidquery(char c[]){ int len=strlen(c); int u=0; for(int i=0;i<len;i++){ int v=c[i]-'a'; int k=trie[u].son[v]; while(k){ if(trie[k].num) ed[trie[k].num]++; k=trie[k].fail; } u=trie[u].son[v]; } }