題目描述
有 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 行,每行乙個...