AC自动机
#include<bits/stdc++.h> using namespace std; #define maxn 1000005 #define maxm 28 struct AC{ int trieN; int ch[maxn][maxm]; int val[maxn]; int fail[maxn]; void init() { trieN=-1; newnod(); } int newnod() { memset(ch[++trieN],0,sizeof ch[0]); val[trieN]=fail[trieN]=0; return trieN; } void insert(const string & str) { int cur=0; for(int i=0;i<str.size();i++){ int d=str[i]-'a'; if(!ch[cur][d]){ ch[cur][d]=newnod(); } cur=ch[cur][d]; } val[cur]++; } void build() { queue<int> q; for(int i=0;i<maxm;i++){ if(ch[0][i]){ q.push(ch[0][i]); } } while(!q.empty()){ int cur=q.front(); q.pop(); for(int i=0;i<maxm;i++){ if(ch[cur][i]){ fail[ch[cur][i]]=ch[fail[cur]][i]; q.push(ch[cur][i]); }else{ ch[cur][i]=ch[fail[cur]][i]; } } } } int query(const string & str) { int res=0,cur=0; for(int i=0;str[i];i++){ int d=str[i]-'a'; cur=ch[cur][d]; int tmp=cur; while(tmp&&val[tmp]>=0){ res+=val[tmp]; val[tmp]=-1; tmp=fail[tmp]; } } return res; } }ac; int main() { string s; int n; scanf("%d",&n); for(int i=0;i<n;i++){ cin>>s; ac.insert(s); } ac.build(); cin>>s; cout<<ac.query(s)<<'\n'; }