AC自動機板子

2021-10-08 09:33:34 字數 983 閱讀 4643

#include

//p3808

#define m 1000007

using

namespace std;

int trie[m][26

],cnt,val[m]

,last[m]

,fail[m]

,n;char s[m]

;void

build()

val[u]++;

//給每個模式串結尾打上標記

}void

getfail()

int r=trie[u]

[i],v=fail[u]

;//如果有該兒子

q.push

(r);

//別忘了push

while

(v&&

!trie[v]

[i]) v=fail[v]

;//其fail指標指向其父親的fail指標所指向的點的該兒子,如果沒有,就一直沿著fail指標找下去

fail[r]

=trie[v]

[i];

last[r]

=val[fail[r]

]?fail[r]

:last[fail[r]];

//轉移優化,由於要求模式串的出現個數,因此直接跳到對答案有貢獻的點 }}

}int

solve()

}return ans;

}signed

main()

getfail()

;//建好fail指標

scanf

("%s"

,s);

//讀入文字串

printf

("%d\n"

,solve()

);return0;

}

推薦ac自動機學習部落格:

%%%ac自動機+dp學習部落格:

%%%

序列自動機 板子總結 例題

乙個模式串s s 1e5 n n 1e5 個詢問,每次詢問乙個串t t 1e3 每次詢問t是不是s的子串行 建一下序列自動機,然後每次在自動機上跑一下,類似trie樹,看看是否存在即可 預處理自動機o 26 s 匹配o n t 算是學習了一下序列自動機 建子串行自動機的時候,優先出現的字母先構建 比...

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