AC自動機(KMP 字典樹)

2021-09-05 16:27:34 字數 892 閱讀 3668

ac自動機(kmp+字典樹)

題目:輸入n個串,判斷有多少個搜尋串的子串

in out

1 47a

ababc

abcd

abcde

abcdef

abcdefg

abcd

#includeusing namespace std;

char str[1000000+100];

struct node

} *root;

void insert()

else //即使憶開闢,也要往下指

p = p->next[pos];

}p->count++; //當前結點使用次數加一,注意是最後字元的結點才加!!

}void getfail()

//temp是根則son失配時必指向根

else

p=p->fail; //如果沒有這個兒子就遞迴失配!

}if(!p) son->fail=root; //廣搜下失配指標為空的只有根故son指向根

}que.push(son);//把指向這個兒子的指標壓入佇列}}

}}void query()

else break;

temp = temp->fail;//當前結點的所有失配點的數量都會被計算,因為本題是求有幾個串是模板串的子串}}

printf("%d\n",cnt);

}int main()

getfail(); //計算失配指標

gets(str); //輸入搜尋串

query(); //詢問搜尋串出出現,子串的次數

}return 0;

}

kmp與ac自動機

xj比賽做到一道字串題,結果發現想打個字串匹配都只會n 2了,又一次忘記了kmp 想必是當初學這玩意心理陰影面積太大了。這裡再梳理一遍kmp和ac自動機 以便下次再忘了有地方看.kmp 用於處理對於字串s,想知道它在另外某個串哪些位置出現的問題,先做預處理得到乙個失配陣列,這個陣列第i位表示s的前i...

字典樹問題與AC自動機

利用字串的公共字首來避免無謂的字串比較,降低查詢時間。字典樹節點 每個節點對應乙個最大可儲存字元陣列。假設字典只存26個小寫英文本母,那麼每個節點下應該有乙個長度為最大26的陣列。換言說,可存的元素型別越多,單個節點占用記憶體越大。如果用字典樹儲存漢字,那麼每個節點必須為數千個常用漢字開闢乙個陣列作...

字典樹哇 AC自動機哇

字典樹 原理 按照每個根向下發散 形成一棵 樹 這個題 需要在每乙個字母處都做統計 求字首單詞 開乙個 二維陣列和ant來 模擬樹 root開始為0 作為 起點 t str i a 作為分支 關鍵就是 ant 這是形成樹的關鍵 ant用來區分每乙個節點 這樣二維陣列 tree才能 真正構建完成 很神...