AC自動機總結

2021-10-04 07:58:46 字數 1802 閱讀 8223

講解: ac自動機講解1

ac自動機講解2

1.模版題:hdu2222

#include

#include

#include

using

namespace std;

int k;

int n;

char s[

10010][

60];char mat[

1100000];

int cnt;

struct node

trie[

1000001];

void

insert

(char

*str)

trie[pos]

.flag++;}

void

get_fail()

}while

(!q.

empty()

)else

trie[now]

.son[i]

=trie[trie[now]

.fail]

.son[i];}

}}intquery

(char

*str)

}return ans;

}int

main()

get_fail()

;scanf

("%s"

,mat)

; cout<<

query

(mat)

<}return0;

}

2.模版題強化:poj3796

不再是簡單得尋找整體最大匹配數,而是尋找各個字串對應的最大匹配數

#include

#include

#include

#include

using

namespace std;

int n;

int cnt;

char s[

160][75

];char t[

1000100];

int trie[

400000][

26];int cntword[

400000];

int res[

400000];

int fail[

400000];

int mark[

400000];

int maxt;

void

insert

(char

*str)

cntword[cnt]++;

}void

getfail()

}while

(!q.

empty()

)else

trie[now]

[i]=trie[fail[now]

][i];}

}}void

query

(char

*str)

//cntword[j]=-1;}}

//return ans;

}int

main()

getfail()

;scanf

("%s"

,t);

query

(t);

cout

int i=

1;i<=cnt;i++)if

(res[i]

==maxt)

}return0;

}

3.hdu6096

AC自動機總結

考慮kmp問題的公升級版,即有多個模式串,單個文字串。問匹配次數。考慮對於每乙個模式串建乙個 fail 然後對於每乙個模式串都和文字串暴力跑。前置知識 trie樹,bfs 沒什麼好說的。演算法實現 我們考慮將所有的模式串放到一顆 trie 樹,如果匹配失敗的話轉移到 fail 指標上面去,這樣子複雜...

AC自動機學習總結

久聞ac自動機的大名,終於,在準備好kmp和字典樹之後,開始學習這個看起來高大上的演算法了。多餘的寫題的時候在補充吧,學完之後發現他的板子並不難,理解也不算太難,網上有很多種寫法,近期研究一下,一些 的常數的問題。洛谷有道題,直接就是板子 參考不知名大佬的板子 看了好多人的板子了 然後放棄指標,因為...

AC自動機 建立nlogn個AC自動機

string set queries 題意 給你3種操作,1 加入乙個串到集合中。2 刪除集合中的某乙個串 3 查詢集合中的字串在給定的字串種出現幾次。同乙個串可重複 解法 建立多個ac自動機,用二進位制分組來處理。加入給你21個串 分為 16 4 1,再新增乙個串的時候,即21 1,22 16 4...