P3796 ac自動機 文字串中出現最多的字串

2021-09-07 09:19:08 字數 1235 閱讀 8758

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

輸入格式:

輸入含多組資料。

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

接下去n行,每行乙個長度小於等於70的模式串。下一行是乙個長度小於等於10^6的文字串t。

輸入結束標誌為n=0。

輸出格式:

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

輸入樣例#1:複製

2

ababab

ababababac

6beta

alpha

haha

delta

dede

tata

dedeltalphahahahototatalpha

0

輸出樣例#1:複製

4

aba2

alpha

haha

#include #include #include #include #include #define maxn 1000000

using namespace std;

struct tree

ac[maxn];

int cnt=0;

struct node

ans[maxn];

string s[maxn];

bool cmp(node a,node b)

void clean(int x)

void build(string s,int no)

}while(!q.empty())

else

ac[u].vis[i]=ac[ac[u].fail].vis[i];}}

}int acquery(string s)

ac[0].fail=0;

getfail();

cin>>s[0];

acquery(s[0]);

sort(ans+1,ans+1+n,cmp);

cout《每個單詞的結尾的ac.end用來記錄每個單詞的序號,建立node結構體記錄 num pos

P3796 模板 AC自動機

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

AC自動機模板 洛谷3796

ac自動機的第三個模板 其實,個人覺得,目前我寫的這三個不同的模板完全是可以合併在一起求解的。只是,在這兩個無關聯的oj上,同乙個ac自動機都可以完成的問題被拆成了三道題而已。因此,只需要略加修改即可解決這道題。具體題目請上洛谷檢視 include include include include i...

luogu3796AC自動機模版

有nn 個由小寫字母組成的模式串以及乙個文字串tt 每個模式串可能會在文字串中出現多次。你需要找出哪些模式串在文字串tt 中出現的次數最多。2 aba bab ababababac 6 beta alpha haha delta dede tata dedeltalphahahahototatalp...