講解: 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...