P3796 模板 AC自動機

2022-05-20 02:26:23 字數 1198 閱讀 5344

傳送門

ac自動機的模板

簡單的理解就是字典樹上的kmp

注意陣列不要開太大

不然每次memset耗時太多

有乙個小優化

每次走 fail 邊找匹配時只有一些會更新答案

那麼就可以把沒用的fail邊壓縮掉

設 g[x] 表示從 x 點一直走 fail 邊,走到的第乙個有結束標記的點

那麼找匹配時就只有要 g 邊

然後就是模板了

#include#include

#include

#include

#include

#include

using

namespace

std;

const

int n=5e4+7

;int

len,n;

char s[1000007

];inline

void read_s()//

文字串比較大,可以用快讀加速

}int c[n][27

],pd[n],fail[n],g[n],cnt;

char a[1670][670]; int l[570

];inline

void clr()//

清空ac自動機

inline

void ins(int num)//

插入單詞到自動機(跟字典樹沒區別)

pd[u]=num;

}queue

q;inline

void pre()//

預處理fail和g}}

}int mx,ans[167

];inline

void query()//

ac自動機匹配(好像跟字典樹也沒什麼區別)

mx=0

;

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

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

cout

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

if(ans[i]==mx)

printf(

"%s\n

",a[i]);

}int

main()

pre();

read_s();

query();

}return0;

}

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

此題是在簡單版的ac自動機基礎上完成,直接附上 ac includeusing namespace std typedef long long ll const int maxn 1e6 5 string t maxn s maxn struct tree dfa maxn 字典樹int cnt 0...

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

題目描述 有個由小寫字母組成的模式串以及乙個文字串。每個模式串可能會在文字串中出現多次。你需要找出哪些模式串在文字串中出現的次數最多。輸入輸出格式 輸入格式 輸入含多組資料。每組資料的第一行為乙個正整數,表示共有個模式串,接下去行,每行乙個長度小於等於的模式串。下一行是乙個長度小於等於的文字串。輸入...

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

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