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

2021-09-07 18:57:23 字數 1571 閱讀 9302

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

輸入格式:

輸入含多組資料。

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

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

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

輸出格式:

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

輸入樣例#1: 

複製

2

ababab

ababababac

6beta

alpha

haha

delta

dede

tata

dedeltalphahahahototatalpha

0

輸出樣例#1: 

複製

4

aba2

alpha

haha

這題真是迷啊,開1e6的記憶體a了,開1e5的記憶體mle

我們統計出每個節點的出現資訊,然後暴力沿著$fail$樹跑就行了

//

luogu-judger-enable-o2

//luogu-judger-enable-o2

//luogu-judger-enable-o2

//luogu-judger-enable-o2

#include#include

#include

#include

using

namespace

std;

const

int maxn = 1e6 + 10, b = 26

;int

t; char s[201][75

], a[maxn];

intn;

int fail[maxn], ch[maxn][27], val[maxn], root = 0, tot = 0

, sum[maxn];

void insert(char *s, int

i) val[now] =i;

}void

getfail()

}int

main()

int ans = 0

;

for(int i = 1; i <= t; i++) ans =max(ans, sum[i]);

printf(

"%d\n

", ans);

for(int i = 1; i <= t; i++)

if(sum[i] ==ans)

printf(

"%s\n

", s[i] + 1

); }

return0;

}

P3796 模板 AC自動機

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

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

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

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

題目描述 有 nn 個由小寫字母組成的模式串以及乙個文字串 tt。每個模式串可能會在文字串 現多次。你需要找出哪些模式串在文字串 tt 現的次數最多。輸入格式 輸入含多組資料。保證輸入資料不超過 5050 組。每組資料的第一行為乙個正整數 nn,表示共有 nn 個模式串,1 leq n leq 15...