//hdu2222
//acauto
//構造失敗指標:設當前節點上的字母為c,沿著他父親的失敗指標走,直到走到乙個節點,他的兒子中也有字母為c的。然後把當前節點的失敗指標指向那個字母也為c的兒子。如果一直走到了root都沒找到,那就把失敗指標指向root。
//匹配(1)當前字元匹配,只需沿該路徑走向下乙個節點繼續匹配即可;(2)當前字元不匹配,則去當前節點失敗指標所指向的字元繼續匹配.重複這2個過程中的乙個,直到模式串走完。
#include
#include
#include
#include
#include
#define cha 26
#define root 0
#define n 500001
using
namespace
std;
struct nodetree[n];
void init(node &a,int data)
int k = 1;
void insert(char s)
p = tree[p].next[data];
}tree[p].count++;
}queue
q;void ac_automation()
q.push(tree[k.next[j]]);}}
}}int get_ans(char s)
int j = k;
while( tree[j].count )
//下面兩句很重要,如果走到頭以後當前字母不是關鍵字終點然而其fail指標指向字母是關鍵字終點的話,
//應當加入此關鍵值,而網上大多數程式忽視了這一點導致hdu的discuss裡反例過不了
ans += tree[ tree[j].fail ].count;
tree[ tree[j].fail ].count = 0;
}return ans;
}char tar[2*n];
int main()
ac_automation();
scanf("%s",tar);
printf("%d\n",get_ans(tar));
}return
0; }
字尾自動機例題精講
這一篇是字尾自動機的一些例題題解及總結 例 bzoj 3998 題意 求乙個字串中第k小子串,t 0表示子串僅區別字典序,t 1表示子串區分起止位置 解析 建起字尾自動機,構造parent樹,利用字尾自動機有向無環累計子串個數查詢即可 具體解析 bzoj 2780 題意 給出很多模板串和很多詢問,每...
AC自動機 建立nlogn個AC自動機
string set queries 題意 給你3種操作,1 加入乙個串到集合中。2 刪除集合中的某乙個串 3 查詢集合中的字串在給定的字串種出現幾次。同乙個串可重複 解法 建立多個ac自動機,用二進位制分組來處理。加入給你21個串 分為 16 4 1,再新增乙個串的時候,即21 1,22 16 4...
AC自動機及字尾自動機
ac自動機是一種基於trie樹的演算法,其本質和kmp上的處理很相似。trie樹結構 kmp轉移思路 ac自動機組要由三個部分組成 trie樹的建立 fail指標的匹配 對ac自動機的詢問 每次建立自動機會有一次初始化 ac自動機類 struct node node結構體 struct ac voi...