#include<bits/stdc++.h> using namespace std; struct nob{ int fail,son[27],ed; }a[1000000]; int cnt=0; void build (string s){ int now=0; for (int i=0; i<s.length(); i++){ if (a[now].son[s[i]-‘a‘]==0) a[now].son[s[i]-‘a‘]=++cnt; now=a[now].son[s[i]-‘a‘]; } a[now].ed++; } void fail(){ queueque; for (int i=0; i<26; i++){ if (a[0].son[i]!=0){ a[a[0].son[i]].fail=0; que.push(a[0].son[i]); } } while (que.size()){ int pos=que.front(); que.pop(); for (int i=0; i<26; i++){ if (a[pos].son[i]!=0){ a[a[pos].son[i]].fail=a[a[pos].fail].son[i]; que.push(a[pos].son[i]); } else a[pos].son[i]=a[a[pos].fail].son[i]; } } } int answer(string s){ int now=0,ans=0; for (int i=0; i<s.length(); i++){ now=a[now].son[s[i]-‘a‘]; for (int t=now; t&&a[t].ed!=-1; t=a[t].fail){ ans+=a[t].ed; a[t].ed=-1; } } return ans; } int main(){ int n; string s; cin>>n; for (int i=1; i<=n; i++){ cin>>s; build(s); } a[0].fail=0; fail(); cin>>s; cout<<answer(s)<<endl; return 0; }
时间: 2024-12-11 01:08:18