ac自動機(字典樹和kmp的延伸)(待更新)

2021-10-23 15:53:25 字數 1133 閱讀 1061

多模匹配演算法

#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...