之前很喜欢用链表写AC自动机,觉得很适合自己的理解。一直都没有接触数组的写法。。
然而稍微难一点的AC自动机的题,大佬们都是用数组写的,搞的我也看不懂大佬的思路。。
所以觉得重新学习一下数组的写法,但是收获还是有的,又学习了一些关于AC自动机的小优化。
struct acAuto{
int Next[Maxn][26] ;
int num[Maxn], fail[Maxn] ;
int cnt ;
void init(){
memset(Next, 0, sizeof(Next)) ;
memset(num, 0, sizeof(num)) ;
memset(fail, 0, sizeof(fail)) ;
cnt = 0 ;
}
void Insert(string s ){
int root = 0;
for (auto i : s){
int id = i - 'a' ;
if (!Next[root][id]){
Next[root][id] = ++cnt ;
}
root = Next[root][id] ;
}
num[root]++ ;
}
void get_fail(){
queue < int > que ;
for (int i = 0; i < 26; i++){
if (Next[0][i]) {
fail[Next[0][i]]= 0 ;
que