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;
}
代码:#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;
}
相关文章推荐
- 【HDU2222】【AC自动机模板 测烂为止】Keywords Search
- HDU 3065 AC自动机模板题
- AC自动机模板
- AC自动机模板
- AC自动机(模板)
- BZOJ 3172 [Tjoi2013] 单词 [AC自动机模板]
- HDU 2222 (AC自动机模板)
- 【AC自动机详解+入门模板】HDU 2222
- HDU2222【AC自动机(基础·模板)】
- hdu 2222 ac自动机模板题
- HDU-2222 Keywords Search (AC自动机模板)
- AC自动机(1)--hdu2222(基本模板)
- AC自动机模板
- (模板)AC自动机
- AC自动机入门+模板 (HDU 2222)
- HDU2222 AC自动机模板
- HDU 3065 病毒侵袭持续中(AC自动机模板)
- ac自动机模板hdu2222
- hdu -2222 Keywords Search(AC自动机模板)
- AC自动机 ( 模板题啊 )——病毒侵袭持续中 ( HDU 3065 )