洛谷 AC自動機模板題三連

2021-09-27 02:00:43 字數 2512 閱讀 5820

簡單版

題意給你n個模式串s,和乙個文字串t求有幾個模式串出現過

思路ac自動機板子題,建完自動機在自動機上跑一下就好

**

#include

using

namespace std;

#define ll long long

const

int n =

1000005

;const

int m =26;

struct acam

void

add(

char

*s)++val[now];}

void

getfail()

}}intquery

(char

*s)return ans;

}}ac;

char s[n]

;int

main()

加強版

題意求出現次數最多的模式串,並列最多按出現順序輸出

思路對ac自動機fail指標反向建樹,根據ac自動機性質可知,子樹出現的串父親必定也會出現,所以每個節點統計子樹大小。

**

#include

using

namespace std;

#define ll long long

const

int n =

155*75;

const

int m =26;

char st[

155][75

], t[

1000005];

struct acam

void

add(

char

*s) pos[tid++

]= now;

++val[now];}

void

getfail()

}}vector<

int> e[n]

;void

dfs(

int u)

}void

solve

(char

*s)for

(int i =

1; i <= n;

++i) e[fail[i]].

push_back

(i);

dfs(0)

;int maxn =0;

for(

int i =

0; i < tid;

++i) maxn =

max(maxn, cnt[pos[i]])

;printf

("%d\n"

,maxn)

;for

(int i =

0; i < tid;

++i)

if(maxn == cnt[pos[i]])

printf

("%s\n"

,st[i]);

for(

int i =

0; i <= n;

++i) e[i]

.clear()

;}}ac;

intmain()

return0;

}

二次加強版 題意

求每個模式串在文字串**現次數

思路還是建fail樹跑一下就好。

**

#include

using

namespace std;

#define ll long long

const

int n =

200005

;const

int m =26;

struct acam

void

add(

char

*s) pos[tid++

]= now;

++val[now];}

void

getfail()

}}vector<

int> e[n]

;void

buildfailtree()

void

clea***iltree()

void

dfs(

int u)

}void

solve

(char

*s)buildfailtree()

;dfs(0

);for(

int i =

0; i < tid;

++i)

printf

("%d\n"

,cnt[pos[i]])

;clea***iltree()

;}}ac;

char s[

200005

], t[

2000005];

intmain()

AC自動機模板 洛谷3796

ac自動機的第三個模板 其實,個人覺得,目前我寫的這三個不同的模板完全是可以合併在一起求解的。只是,在這兩個無關聯的oj上,同乙個ac自動機都可以完成的問題被拆成了三道題而已。因此,只需要略加修改即可解決這道題。具體題目請上洛谷檢視 include include include include i...

AC自動機模板題

5分鐘打乙個,還是手太生。嘛這個東西單獨搞是沒有難度的 與其他演算法結合起來才是 黑上加黑 光速逃 願意的話可以看看徐大佬的部落格 include define maxn 1000005 using namespace std int n,len,u,ch maxn 29 tot,fail maxn...

洛谷P5357 AC自動機模板題

p5357 對應輸出n個模式串在文字串 現的次數 ac自動機?坑點 可能出現重複模板串,所以標記結尾時做相應的修改即可 這裡的寫法是把fail樹對應的圖建出來了,其實不需要建也可以求出 這不重要 void getans void include using namespace std typedef...