1 #include<cstdio> 2 #include<algorithm> 3 #include<queue> 4 #include<cstring> 5 #define N 1000010 6 #define rg register 7 using namespace std; 8 int n,ans,tot,c[N][26],val[N],fail[N]; 9 char s[N]; 10 queue<int>q; 11 inline int read(){ 12 int k=0,f=1; char c=getchar(); 13 while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); 14 while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar(); 15 return k*f; 16 } 17 void insert(char *s){ 18 int len=strlen(s),now=0; 19 for(rg int i=0,v;i<len;i++){ 20 if(!c[now][v=s[i]-'a']) c[now][v]=++tot; 21 now=c[now][v]; 22 } 23 val[now]++; 24 } 25 void build(){ 26 for(rg int i=0;i<26;i++)if(c[0][i])fail[c[0][i]]=0,q.push(c[0][i]); 27 while(!q.empty()){ 28 int u=q.front(); q.pop(); 29 for(rg int i=0;i<26;i++) 30 if(c[u][i])fail[c[u][i]]=c[fail[u]][i],q.push(c[u][i]); 31 else c[u][i]=c[fail[u]][i]; 32 } 33 } 34 void query(char *s){ 35 int len=strlen(s),now=0; 36 for(rg int i=0;i<len;i++){ 37 now=c[now][s[i]-'a']; 38 for(rg int t=now;t&&~val[t];t=fail[t])ans+=val[t],val[t]=-1; 39 } 40 } 41 int main(){ 42 n=read(); 43 for(rg int i=1;i<=n;i++) scanf("%s",s),insert(s); 44 build(); 45 scanf("%s",s); query(s); 46 printf("%d\n",ans); 47 return 0; 48 }
洛谷 3808