您的位置:首页 > 其它

ac自动机模板 1

2017-12-28 13:51 225 查看
题目: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自动机