标签:复杂度 连接 include 转移 strlen insert bfs 字符串 mat
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
const int MA=1e6+5;
//AC自动机
struct Aho{
struct state{
int net[26];
int fail,cnt;// 失配指针,到这个点有多少个点结束
}stateTable[MA];
int ac_size;
queue<int> que;
//初始化
void init()
{
while(que.size()) que.pop();
for(int i = 0; i < MA; ++ i){
memset(stateTable[i].net, 0, sizeof(stateTable[i].net));
stateTable[i].fail = stateTable[i].cnt=0;
}
ac_size = 1;
}
//建立trie树
void ac_insert(char *S)
{
int n = strlen(S);
int now = 0;
for(int i=0;i<n;++i){
int si=S[i] - 'a';
if(!stateTable[now].net[si])
stateTable[now].net[si] = ac_size++;
now = stateTable[now].net[si];
}
stateTable[now].cnt++;
}
//建立fail指针
void ac_build()
{
stateTable[0].fail=-1;
que.push(0);
while(que.size()){
int u = que.front();
que.pop();
for(int i = 0; i < 26; ++ i){
if(stateTable[u].net[i]){
if(u == 0) stateTable[stateTable[u].net[i]].fail = 0;
else{
int v = stateTable[u].fail;
while(v != -1){
if(stateTable[v].net[i]){
stateTable[stateTable[u].net[i]].fail = stateTable[v].net[i];
break;
}
v = stateTable[v].fail;
}
if(v == -1)stateTable[stateTable[u].net[i]].fail = 0;
}
que.push(stateTable[u].net[i]);
}
}
}
}
//
int ac_get(int u)
{
int res=0;
while(u){
res+=stateTable[u].cnt;
stateTable[u].cnt=0;
u=stateTable[u].fail;
}
return res;
}
//计算
int ac_match(char *S)
{
int n =strlen(S);
int res = 0, now = 0;
for(int i=0;i<n;++i){
int si=S[i]-'a';
if(stateTable[now].net[si])
now=stateTable[now].net[si];
else{
int p=stateTable[now].fail;
while(p!=-1&&!stateTable[p].net[si])p = stateTable[p].fail;
if(p==-1) now=0;
else now=stateTable[p].net[si];
}
if(stateTable[now].cnt)
res+=ac_get(now);
}
return res;
}
}aho;
int T,N;
char s[MA];
int main()
{
scanf("%d",&T);
while(T--){
aho.init();
scanf("%d",&N);
for(int i=0;i<N;++i){
scanf("%s",s);
aho.ac_insert(s);
}
aho.ac_build();
scanf("%s",s);
printf("%d\n",aho.ac_match(s));
}
return 0;
}
标签:复杂度 连接 include 转移 strlen insert bfs 字符串 mat
原文地址:https://www.cnblogs.com/A-sc/p/11402819.html