洛谷 P3796 模板 AC自動機(加強版)

2021-10-11 12:26:38 字數 1432 閱讀 2613

題目描述

有 nn 個由小寫字母組成的模式串以及乙個文字串 tt。每個模式串可能會在文字串**現多次。你需要找出哪些模式串在文字串 tt **現的次數最多。

輸入格式

輸入含多組資料。保證輸入資料不超過 5050 組。

每組資料的第一行為乙個正整數 nn,表示共有 nn 個模式串,1 \leq n \leq 1501≤n≤150。

接下去 nn 行,每行乙個長度小於等於 7070 的模式串。下一行是乙個長度小於等於 10^610

6的文字串 tt。保證不存在兩個相同的模式串。

輸入結束標誌為 n=0n=0。

輸出格式

對於每組資料,第一行輸出模式串最多出現的次數,接下去若干行每行輸出乙個出現次數最多的模式串,按輸入順序排列。

輸入輸出樣例

輸入 #1 複製

2aba

babababababac

6beta

alpha

haha

delta

dede

tata

dedeltalphahahahototatalpha

0輸出 #1 複製

4aba

2alpha

haha

分析:記錄每個模式串最後乙個字母在tire樹上的編號,遍歷文字串,找到出現最多次的模式串。

#include

#define ll long long

using

namespace std;

const

int n =

75,m =

155,e=n*m,s=

1e6+10;

char st[m]

[n],dd[s]

;int cnt[e]

,tr[e][26

],ne[e]

,q[e]

,idx,f[m]

;void

insert

(int t)

f[t]

=p;}

void

build()

while

(hh<=tt)}}

}int

main()

build()

;scanf

("%s"

,dd)

;int m=

strlen

(dd)

;int j=0;

for(

int i=

0;iint mx=-1

;for

(int i=

1;i<=n;i++)}

printf

("%d\n"

,mx)

;for

(int i=

1;i<=n;i++)}

}return0;

}

P3796 模板 AC自動機

傳送門 ac自動機的模板 簡單的理解就是字典樹上的kmp 注意陣列不要開太大 不然每次memset耗時太多 有乙個小優化 每次走 fail 邊找匹配時只有一些會更新答案 那麼就可以把沒用的fail邊壓縮掉 設 g x 表示從 x 點一直走 fail 邊,走到的第乙個有結束標記的點 那麼找匹配時就只有...

洛谷P3796 模板 AC自動機(加強版)

題目描述 有個由小寫字母組成的模式串以及乙個文字串。每個模式串可能會在文字串中出現多次。你需要找出哪些模式串在文字串中出現的次數最多。輸入輸出格式 輸入格式 輸入含多組資料。每組資料的第一行為乙個正整數,表示共有個模式串,接下去行,每行乙個長度小於等於的模式串。下一行是乙個長度小於等於的文字串。輸入...

洛谷P3796 模板 AC自動機(加強版)

有 nn 個由小寫字母組成的模式串以及乙個文字串 tt 每個模式串可能會在文字串 現多次。你需要找出哪些模式串在文字串 tt 現的次數最多。輸入格式 輸入含多組資料。每組資料的第一行為乙個正整數 nn 表示共有 nn 個模式串,1 leq n leq 1501 n 150 接下去 nn 行,每行乙個...