AC自動機精講

2021-07-13 20:20:14 字數 1139 閱讀 9711

//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...