有 nn 個由小寫字母組成的模式串以及乙個文字串 tt 。每個模式串可能會在文字串**現多次。你需要找出哪些模式串在文字串 tt **現的次數最多。
輸入格式:
輸入含多組資料。
每組資料的第一行為乙個正整數 nn ,表示共有 nn 個模式串, 1 \leq n \leq 1501≤n≤150 。
接下去 nn 行,每行乙個長度小於等於 7070 的模式串。下一行是乙個長度小於等於 10^6106 的文字串 tt 。
輸入結束標誌為 n=0n=0 。
輸出格式:
對於每組資料,第一行輸出模式串最多出現的次數,接下去若干行每行輸出乙個出現次數最多的模式串,按輸入順序排列。
輸入樣例#1:
複製
2ababab
ababababac
6beta
alpha
haha
delta
dede
tata
dedeltalphahahahototatalpha
0
輸出樣例#1:
複製
4aba2
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...