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才能 真正構建完成 很神...