题意:
给定n个模式串和一个匹配串,问有多少个模式串在匹配串中出现过。
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=2e6+5;
char s[maxm];
struct AC{
int a[maxm][26];
int fail[maxm];
int val[maxm];
int tot=0;
void init(){//clear
for(int i=0;i<=tot;i++){
memset(a[i],0,sizeof a[i]);
fail[i]=val[i]=0;
}
tot=0;
}
void add(char *s){//建trie
int len=strlen(s);
int node=0;
for(int i=0;i<len;i++){
int v=s[i]-'a';
if(!a[node][v])a[node][v]=++tot;
node=a[node][v];
}
val[node]++;
}
void build(){//构造fail
queue<int>q;
for(int i=0;i<26;i++){
if(a[0][i]){
q.push(a[0][i]);
}
}
while(q.size()){
int x=q.front();q.pop();
for(int i=0;i<26;i++){
if(a[x][i]){
fail[a[x][i]]=a[fail[x]][i];
q.push(a[x][i]);
}else{
a[x][i]=a[fail[x]][i];
}
}
}
}
int ask(char* s){
int len=strlen(s);
int ans=0;
int node=0;
for(int i=0;i<len;i++){
int v=s[i]-'a';
node=a[node][v];
for(int t=node;t&&val[t]!=-1;t=fail[t]){
ans+=val[t];
val[t]=-1;
}
}
return ans;
}
}ac;
signed main(){
ac.init();
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>s;
ac.add(s);
}
ac.build();
cin>>s;
int ans=ac.ask(s);
cout<<ans<<endl;
return 0;
}