#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std ;
const int ms=200*501;
const int ch=200*501;
const int M=100010;
const int N=510;
char s[M];
int n,m,sum;
struct Trie{
int c[ms][ch];
int value[ms],f[ms],last,[ms];
int sz;
int ans[N];
Trie(){
size=1;
}
int idx(char c){
return (int) c;
}
void insert (char *s,int v){
int u=0,len=strlen (s),i,x;
for (i=0;i<len;i++){
x=idx (s[i]);
if (!c[u][x]){
c[u][x]=sz++;
val[sz]=0;
}
u=c[u][x];
}
val[u]=v;
}
void get_fail (){
queue <int> q;
f[0]=0;
int i,u,now,v;
for (i=1;i<ch;i++){
u=c[0][i];
if (u){
f[u]=0;
q.push (u);
last[u]=0;
}
}
while (!q.empty ()){
now=q.front ();
q.pop ();
for (i=0;i<ch;i++){
u=c[r][i];
if (!u){
c[r][i]=c[f[r]][i];
continue;
}
q.push (u);
v=f[r];
while (v&!c[v][i]) v=f[v];
f[u]=c[v][i];
last[u]=val[f[u]] ? f[u] : last[f[u]];
}
}
}
void print(int j){//查詢並存儲匹配串
ok = 1;
if(j){
ans[val[j]] = 1;
print(last[j]);
}
}
void match(char *s){//模式串匹配
int len=strlen(s),j=0;
int child,i;
for(i=0;i<len;i++){
ch=idx(s[i]);
j=c[j][child];
if(val[j]) print(j);
else {
if(val[last[j]]) print(last[j]);
}
}
}
}T;
自學AC自動機
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.