标签:blog ar for on div log amp as tt
AC自动机
struct ACauto { int ch[MAXN][26]; int size; int f[MAXN],last[MAXN],val[MAXN],cnt[MAXN]; void init()//初始化 { size=1; memset(ch[0],0,sizeof(ch[0])); memset(cnt,0,sizeof(cnt)); //用于统计配对数 } int idx(char c)//用于返回编号 { return c-‘a‘; } void insert(char *s,int v)//将字符串s插入字典树中,其中v是字符串的编号 { int u=0,len=strlen(s); for (int i=0;i<len;i++) { int c=idx(s[i]); if (!ch[u][c]) { memset(ch[size],0,sizeof(ch[size])); val[size]=0; ch[u][c]=size++; } u=ch[u][c]; } val[u]=v;//在字符串末尾做出标记,标记为字符串的编号i } void print(int j)//用于输出处理 { if (j) { cnt[val[j]]++;//成功配对数加1 print(last[j]); } } int getFail()//构造失配函数 { queue <int> q; f[0]=0; for (int c=0;c<26;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<26;c++) { int u=ch[r][c]; if (!u) { ch[r][c]=ch[f[r]][c]; continue; } q.push(u); int v=f[r]; f[u]=ch[v][c]; last[u]=val[f[u]]?f[u]:last[f[u]]; } } } void find(char *T)//AC自动机主函数 { 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); else if (last[j]) print(last[j]); } } }ac;
标签:blog ar for on div log amp as tt
原文地址:http://www.cnblogs.com/zhyfzy/p/4148186.html