HDU 2222 Keywords Search (AC自动机模板题)
生活随笔
收集整理的這篇文章主要介紹了
HDU 2222 Keywords Search (AC自动机模板题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一組數據:
1
3
sss
sss
sss
sss
ans:3
?
#include <cstdio> #include <cstdlib> #include <vector> #include <algorithm> #include <cstring>using namespace std;//MAX_NODE = StringNumber * StringLength const int MAX_NODE = 10100 * 50; //節點個數,一般字符形式的題26個 const int CHILD_NUM = 26; const int MAXN = 1000100;struct ACAutomaton {//每個節點的兒子,即當前節點的狀態轉移int chd[MAX_NODE][CHILD_NUM];//記錄題目給的關鍵數據int val[MAX_NODE];//傳說中的fail指針int fail[MAX_NODE];//隊列,用于廣度優先計算fail指針int Q[MAX_NODE];//字母對應的IDint ID[128];//已使用節點個數int sz;//初始化,計算字母對應的兒子ID,如:'a'->0 ... 'z'->25void Initialize() {fail[0] = 0;for (int i = 0 ; i < CHILD_NUM ; i ++) {ID[i+'a'] = i;}}//重新建樹需先Resetvoid Reset() {memset(chd[0] , 0 , sizeof(chd[0]));memset( val, 0, sizeof(val) );sz = 1;}//將權值為key的字符串a插入到trie中void Insert(char *a, int key) {int p = 0;for ( ; *a ; a ++) {int c = ID[(int)(*a)];if (!chd[p][c]) {memset(chd[sz] , 0 , sizeof(chd[sz]));val[sz] = 0;chd[p][c] = sz ++;}p = chd[p][c];}val[p] += key;}//建立AC自動機,確定每個節點的權值以及狀態轉移void Construct() {int *s = Q , *e = Q;for (int i = 0 ; i < CHILD_NUM ; i ++) {if (chd[0][i]) {fail[ chd[0][i] ] = 0;*e ++ = chd[0][i];}}while (s != e) {int u = *s++;for (int i = 0 ; i < CHILD_NUM ; i ++) {int &v = chd[u][i];if (v) {*e ++ = v;fail[v] = chd[ fail[u] ][i];//以下一行代碼要根據題目所給val的含義來寫//val[v] |= val[ fail[v] ];} else {v = chd[ fail[u] ][i];}}}}int Search( char *str ){int ans = 0;int i = 0;int p = 0;while ( str[i] ){int c = ID[ (int)(str[i]) ];while ( p != 0 && !chd[p][c] ) p = fail[p];if ( chd[p][c] ) p = chd[p][c];else p = 0;int tmp = p;while( tmp != 0 && val[tmp] != 0 ){ans += val[tmp];val[tmp] = 0;tmp = fail[tmp];}++i;}return ans;} }AC;int N; char str[MAXN];int main() {AC.Initialize();int T;scanf( "%d", &T );while ( T-- ){char tmp[60];scanf( "%d", &N );AC.Reset();for ( int i = 0; i < N; ++i ){scanf( "%s", tmp );AC.Insert( tmp, 1 );}AC.Construct();scanf( "%s", str );printf( "%d\n", AC.Search(str) );}return 0; }?
轉載于:https://www.cnblogs.com/GBRgbr/p/3364885.html
總結
以上是生活随笔為你收集整理的HDU 2222 Keywords Search (AC自动机模板题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .net导出Excel几种方式比较
- 下一篇: restful 学习地址