ac自动机模板
来源:互联网 发布:矩阵式组织属于 编辑:程序博客网 时间:2024/06/05 18:18
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]];
}
}
}
};
0 0
- 【AC自动机】AC自动机模板
- AC自动机模板
- AC自动机模板
- AC自动机模板
- AC自动机模板
- AC自动机模板
- AC自动机模板
- AC自动机模板 hdu2222
- AC自动机模板
- AC自动机模板
- 数据结构--AC自动机--模板
- ac自动机模板
- AC自动机模板
- AC自动机模板
- hdu2222 ac自动机模板
- ac自动机模板。。。。。
- AC自动机模板 LA4670
- AC自动机模板
- Javah 使用时报错:找不到类
- Unable to create unsliced image from csi bitmap data
- 用VS2012或VS2013在win7下编写的程序在XP下运行就出现“不是有效的win32应用程序
- HDU 2476 - String painter(区间DP)
- 面试题:Integer和int的区别?在什么时候用Integer和什么时候用int
- ac自动机模板
- LeetCode:Reverse Words in a String
- 整包升级与差分升级的区别
- 实现signal和slot机制(2)-跨线程投递
- Microsoft.Office.Access数据库引擎无法打开文件
- MAC 下编写opengl3+程序
- 如何使用高德地图
- 面试题:数组有没有length()方法? 字符串有没有length()方法? 集合有没有length()方法?
- 深复制和浅复制(clone)