题目:ac自动机模板
代码:
#include<iostream>
#include<cstdio>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <cstring>
#include <map>
using namespace std;
#define maxn 1000000
#define maxs 26
struct AC {
int ch[maxn+5][maxs];
int val[maxn+5];
int sz;
int Fail[maxn+5];
int sum;
int que[maxn+5];
void clear() {
memset(ch,0,sizeof(ch));
memset(val,0,sizeof(val));
memset(Fail,0,sizeof(Fail));
sz=sum=0;
}
void insert(char* x,int len) {
int u=0;
for(int i=0; i<len; i++) {
int y=x[i]-'a';
if(!ch[u][y]) {
ch[u][y]=++sz;
}
u=ch[u][y];
}
val[u]++;
}
void make_fail() {
queue<int> que;
for(int i=0; i<maxs; i++) {
if(ch[0][i]) que.push(ch[0][i]);
}
while(!que.empty()) {
int u=que.front();
que.pop();
for(int i=0; i<maxs; i++) {
if(ch[u][i]==0) {
ch[u][i]=ch[Fail[u]][i];
continue;
}
que.push(ch[u][i]);
Fail[ch[u][i]]=ch[Fail[u]][i];
}
}
}
void find(char* s,int len) {
int j=0;
for(int i=0; i<len; i++) {
int x=s[i]-'a';
j=ch[j][x];
for(int k=j; k&&(~val[k]); k=Fail[k]) {
sum+=val[k];
val[k]=-1;
}
}
}
};
int n;
AC ac;
int main() {
ac.clear();
scanf("%d",&n);
char x[maxn+5];
for(int i=0; i<n; i++) {
scanf("%s",x);
ac.insert(x,strlen(x));
}
ac.make_fail();
char s[maxn+5];
scanf("%s",s);
ac.find(s,strlen(s));
printf("%d",ac.sum);
return 0;
}
本文介绍了一种基于AC自动机的字符串匹配算法实现,通过详细解释代码结构来帮助读者理解AC自动机的工作原理及其在模式匹配中的应用。该实现包括构建失败指针、插入模式串及查找匹配等功能。
1810

被折叠的 条评论
为什么被折叠?



