AC自动机【模板】
#include<bits/stdc++.h> using namespace std; int n; string s; struct jhh { int fail; int vis[26]; int end; }a[100001]; int cnt=0; void build(string s) { int l=s.length(); int now=0; for(int i=0;i<l;++i) { if(a[now].vis[s[i]-'a']==0) { a[now].vis[s[i]-'a']=++cnt; now=a[now].vis[s[i]-'a']; } } a[now].end+=1; } void gf() { queue<int>q; for(int i=0;i<26;++i) { if(a[0].vis[i]!=0) { a[a[0].vis[i]].fail=0; q.push(a[0].vis[i]); } } while(!q.empty()) { int u=q.front(); q.pop(); for(int i=0;i<26;i++) { if(a[u].vis[i]!=0) { a[a[u].vis[i]].fail=a[a[u].fail].vis[i]; q.push(a[u].vis[i]); } else a[u].vis[i]=a[a[u].fail].vis[i]; } } } int aq(string s) { int l=s.length(); int now=0,ans=0; for(int i=0;i<l;++i) { now=a[now].vis[s[i]-'a']; for(int t=now;t&&a[t].end!=-1;t=a[t].fail) { ans+=a[t].end; a[t].end=-1; } } return ans; } int main() { while(cin>>n) { if(n==0) break; for(int i=1;i<=n;i++) { cin>>s; build(s); } } a[0].fail=0; gf(); cin>>s; cout<<aq(s)<<" ";; }