ac自动机模板
2015-06-04 21:06
274 查看
template<int maxnode,int sigma_size>
struct Aho_Corasick{
int ch[maxnode][sigma_size];
int val[maxnode],last[maxnode],f[maxnode];
int sz;
//int cnt[maxnode];
//bool mark[maxnode];
Aho_Corasick() {
sz=1;
memset(ch[0],0,sizeof(ch[0]));
}
int idx(char c) {
return c-'a';
}
void init() {
sz=1;
memset(ch[0],0,sizeof(ch[0]));
// memset(cnt,0,sizeof(cnt));
//memset(mark,0,sizeof(mark));
}
void insert(char *s,int v) {
int u=0,n=strlen(s);
for(int i=0;i<n;i++) {
int c=idx(s[i]);
if(!ch[u][c]) {
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]=v;
cnt[u]++;
}
int find(char *T) {
int ans=0;
int n=strlen(T);
int j=0;
for(int i=0;i<n;i++) {
int c=idx(T[i]);
while(j && !ch[j][c]) j=f[j];
j=ch[j][c];
if(val[j]) print(j,ans);
else print(last[j],ans);
//printf("FF %d %d\n",i,ans);
}
return ans;
}
void print(int j,int &ans) {
if(j && !mark[j]) {
ans+=cnt[j];
mark[j]=1;
print(last[j],ans);
}
}
void getFail() {
queue<int>q;
f[0]=0;
last[0]=0;
for(int c=0;c<sigma_size;c++) {
int u=ch[0][c];
if(u) {
f[u]=0;q.push(u);last[u]=0;
}
}
while(!q.empty()) {
int r=q.front();q.pop();
for(int c=0;c<sigma_size;c++) {
int u=ch[r][c];
if(!u) { ch[r][c]=ch[f[r]][c]; continue; }
q.push(u);
int v=f[r];
while(v && !ch[v][c]) v=f[v];
f[u]=ch[v][c];
last[u]=val[f[u]]?f[u]:last[f[u]];
}
}
}
};
struct Aho_Corasick{
int ch[maxnode][sigma_size];
int val[maxnode],last[maxnode],f[maxnode];
int sz;
//int cnt[maxnode];
//bool mark[maxnode];
Aho_Corasick() {
sz=1;
memset(ch[0],0,sizeof(ch[0]));
}
int idx(char c) {
return c-'a';
}
void init() {
sz=1;
memset(ch[0],0,sizeof(ch[0]));
// memset(cnt,0,sizeof(cnt));
//memset(mark,0,sizeof(mark));
}
void insert(char *s,int v) {
int u=0,n=strlen(s);
for(int i=0;i<n;i++) {
int c=idx(s[i]);
if(!ch[u][c]) {
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]=v;
cnt[u]++;
}
int find(char *T) {
int ans=0;
int n=strlen(T);
int j=0;
for(int i=0;i<n;i++) {
int c=idx(T[i]);
while(j && !ch[j][c]) j=f[j];
j=ch[j][c];
if(val[j]) print(j,ans);
else print(last[j],ans);
//printf("FF %d %d\n",i,ans);
}
return ans;
}
void print(int j,int &ans) {
if(j && !mark[j]) {
ans+=cnt[j];
mark[j]=1;
print(last[j],ans);
}
}
void getFail() {
queue<int>q;
f[0]=0;
last[0]=0;
for(int c=0;c<sigma_size;c++) {
int u=ch[0][c];
if(u) {
f[u]=0;q.push(u);last[u]=0;
}
}
while(!q.empty()) {
int r=q.front();q.pop();
for(int c=0;c<sigma_size;c++) {
int u=ch[r][c];
if(!u) { ch[r][c]=ch[f[r]][c]; continue; }
q.push(u);
int v=f[r];
while(v && !ch[v][c]) v=f[v];
f[u]=ch[v][c];
last[u]=val[f[u]]?f[u]:last[f[u]];
}
}
}
};
相关文章推荐
- 关于RMI的几个问题解决
- 黑马程序员——C语言基础——文件读写实战
- node操作MongoDB数据库之插入
- 聚焦 SQL 数据库活动异地复制
- 聚焦 SQL 数据库活动异地复制
- 聚焦 SQL 数据库活动异地复制
- 聚焦 SQL 数据库活动异地复制
- windows的定时任务设置
- POJ 2431 Expedition
- 解决百度定位获取position为空的困惑
- STL --> stack栈
- 利用NLB群集实现WEB站点的高可用部署
- 文件名通配符 “?” “*” “[]” “[!]”
- 反射_类加载器_代理
- P122.42
- JAVA基础——IO流
- 欢迎使用CSDN-markdown编辑器
- Mac OS安装Apache、Tomcat、Nginx、PHP、MySQL、终端配色
- 英语要提高阅读和听力
- 小组自评、互评