傳送門
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 行,每行乙個...