多模匹配演算法
#include
#pragma gcc optimize(2)
using
namespace std;
typedef
long
long ll;
const
int inf=
0x3f3f3f3f
;const
int maxn=
1e6+7;
int a[maxn][26
],fail[maxn]
,cnt[maxn]
;//字典樹,失敗時的回溯指標,記錄該單詞出現次數
int tot,rt,n;
string sz;
void
insert
(string s)
cnt[rt]++;
}void
getfail()
else a[x]
[i]=a[fail[x]
][i];}
}}intquery
(string s)
}return ans;
}int
main()
fail[0]
=0;getfail()
; cin>>sz;
cout<<
query
(sz);}
/*5
shehe
sayshr
heryasherhs
3*/
分析過程時,最好弄個完全26叉樹,根節點下再弄排根節點,看最下面的根節點的a陣列,fail失溯指標不難理解。
加強版模板題:(洛谷p3796)
有 n 個由小寫字母組成的模式串以及乙個文字串 t。每個模式串可能會在文字串**現多次。你需要找出哪些模式串在文字串 t **現的次數最多。
輸出:第一行輸出模式串最多出現的次數,接下去若干行每行輸出乙個出現次數最多的模式串,按輸入順序排列。
普通題解
我看見這題網上還有ac自動機和樹狀陣列結合做的,時間複雜度更小 玄學題解
例題:題集
hdu - 2896 :記錄哪些字串出現和其出現次數。
poj - 2778 :ac自動機+矩陣乘法的結合(待完善)
AC自動機(KMP 字典樹)
ac自動機 kmp 字典樹 題目 輸入n個串,判斷有多少個搜尋串的子串 in out 1 47a ababc abcd abcde abcdef abcdefg abcd includeusing namespace std char str 1000000 100 struct node root...
KMP 和 AC 自動機(坑)
xyynb kmp這裡,字串從1開始計數!眾所周知,kmp是一種單串匹配演算法,把樸素演算法的o s t 優化到了o s t 如上圖,在進行樸素演算法時,如果我們已經進行了一些匹配成功,實際上我們就知道了原串的一些資訊,理論上就可以使用這個資訊來加速匹配,跳過一些絕對不可能匹配成功的情況。所以,該怎...
kmp與ac自動機
xj比賽做到一道字串題,結果發現想打個字串匹配都只會n 2了,又一次忘記了kmp 想必是當初學這玩意心理陰影面積太大了。這裡再梳理一遍kmp和ac自動機 以便下次再忘了有地方看.kmp 用於處理對於字串s,想知道它在另外某個串哪些位置出現的問題,先做預處理得到乙個失配陣列,這個陣列第i位表示s的前i...