題目描述
有個由小寫字母組成的模式串以及乙個文字串。每個模式串可能會在文字串中出現多次。你需要找出哪些模式串在文字串中出現的次數最多。
輸入輸出格式
輸入格式:
輸入含多組資料。
每組資料的第一行為乙個正整數,表示共有個模式串,。
接下去行,每行乙個長度小於等於的模式串。下一行是乙個長度小於等於的文字串。
輸入結束標誌為。
輸出格式:
對於每組資料,第一行輸出模式串最多出現的次數,接下去若干行每行輸出乙個出現次數最多的模式串,按輸入順序排列。
輸入輸出樣例
輸入樣例#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...