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

2021-08-04 08:37:24 字數 1357 閱讀 1745

題目描述

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

輸入輸出格式

輸入格式:

輸入含多組資料。

每組資料的第一行為乙個正整數,表示共有個模式串,。

接下去行,每行乙個長度小於等於的模式串。下一行是乙個長度小於等於的文字串。

輸入結束標誌為。

輸出格式:

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

輸入輸出樣例

輸入樣例#1:

2 aba

bab

ababababac

6 beta

alpha

haha

delta

dede

tata

dedeltalphahahahototatalpha

0 輸出樣例#1:

4 aba

2 alpha

haha

題解 在簡單版上稍加改動,記錄每個單詞結束的節點位置,記錄出現次數即可

**

#include

#include

#include

using namespace std;

inline int

read()

while (ch>='0'&&ch<='9')

return

x*f;

}char s[151][71],m[1000001];

int tot,n,a[1000001][26],danger[1000001],point[1000001],hash[1000001],ans[151];

intq[1000001];

inline void ins(int

x) hash[now]=x;

}inline void acmach()

else a[now][i]=a[point[now]][i];

}}inline void solve()

}int main()

acmach();

scanf("%s",m);

solve();

int mx=0;

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

mx=max(mx,ans[i]);

printf("%d\n",mx);

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

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

n=read();

}return

0;}

P3796 模板 AC自動機

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

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

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

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

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