struct AhoCorasickAutomata{
int ch[maxnode][sigma_size];
int val[maxnode];
int sz;
Trie() {sz=1;memset(ch[0],0,sizeof(ch[0]));}
int idx(char c) {return c-'a';}
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));
val[sz]=0;
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]=v;
}//to build a trie
int getfail(){
queue<int> q;
f[0]=0;
for(int c=0;c<sigmasize;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<sigmasize;c++){
int u=ch[r][c];
if(!u) continue;
q.push(u);
int v=f[r];
while(v && !ch[v][c]) v=f[v];
f[u]=ch[v][c];//寻找相同的c节点,
last[u]=val[f[u]]?f[u]:last[f[u]];//单词结点
}
}//BFS得到失配函数
}
void find(char* T){
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];
print()....//找到了 执行操作
}
}
void print()
};
欢迎使用优快云-markdown编辑器
最新推荐文章于 2021-01-07 23:01:28 发布