标签:style blog http color os 使用 ar for sp
void Insert(string str,int v) { int u=0,c; for(int i=0;i<str.size();i++) { c=str[i]-‘a‘; if(!ch[u][c]) { val[sz]=0; ch[u][c]=sz++; } u=ch[u][c]; } val[u]=v; }
getfail采用BFS,逐个检查,记录后缀链接last数组
void GetFail() { queue<int> Q; f[0]=0; for(int c=0;c<26;c++) { int u=ch[0][c]; if(u) { f[u]=last[u]=0; Q.push(u); } } 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]; while(v&&!ch[v][c]) v=f[v]; f[u]=ch[v][c]; last[u]=val[f[u]]?f[u]:last[f[u]]; } } }
find对应的是原文
void Find(string str) { int j=0,c; for(int i=0;i<str.size();i++) { c=str[i]-‘a‘; j=ch[j][c]; if(val[j]) print(j); else if(last[j]) print(last[j]); } }
print表示在确定一个串后的操作
void print(int j) { if(j) { cnt[val[j]]++; print(last[j]); } }
整个自动机中,最重要的是后缀链接last数组的使用,对于一个单词的尾结点,可能对应多个串,需要沿着往回走,看看有没有串了。
@练习题
HDU 2222
HDU 2896
HDU 3065
标签:style blog http color os 使用 ar for sp
原文地址:http://www.cnblogs.com/neopenx/p/4004407.html