5分钟打一个,还是手太生。。。。
嘛这个东西单独搞是没有难度的
与其他算法结合起来才是(黑上加黑(光速逃))
愿意的话可以看看徐大佬的博客
#include<bits/stdc++.h>
#define MAXN 1000005
using namespace std;
int n,len,u,ch[MAXN][29],tot,fail[MAXN],judge[MAXN],ans[MAXN],sum;
char a[MAXN * 2];
void init(){
sum = 0;
tot = 1;
memset(ch , -1 , sizeof(ch));
memset(ans , 0 , sizeof(ans));
memset(judge , -1 , sizeof(judge));
cin>>n;
for(int i = 1 ; i <= n ; i++){
scanf("%s" , a);
u = 1 ; len = strlen(a);
for(int j = 0 ; j < len ; j++){
int v = a[j] - 'a';
if(ch[u][v] == (-1))tot++,ch[u][v] = tot;
u = ch[u][v];
}
ans[u]++;
}
for(int i = 0 ; i < 26 ; i++)ch[0][i] = 1;
queue<int>q;q.push(1);fail[1] = 0;
while(!q.empty()){
u = q.front();q.pop();
for(int i = 0 ; i < 26 ; i++){
if(ch[u][i] == (-1)){ch[u][i] =ch[fail[u]][i] ; continue;}
fail[ch[u][i]] = ch[fail[u]][i];
q.push(ch[u][i]);
}
}
}
void que(){
scanf("%s" , a);
u = 1 ; len = strlen(a);
for(int i = 0 ; i < len ; i++){
int k = ch[u][a[i] - 'a'];
while(k > 1 && judge[k] == (-1)){
sum+=ans[k];
judge[k] = 1;
k = fail[k];
}
u =ch[u][a[i] - 'a'];
}
cout<<sum<<endl;
}
int main(){
init();
que();
}