題目大意:
給你n個模式串t
it_i
ti,乙個匹配串s.問你每個模式串出現過多少次.
n ≤2
e5,∑
∣ti∣
≤2e5
,∣s∣
≤1e6
n \leq 2e5 ,\sum |t_i| \leq 2e5 , |s| \leq 1e6
n≤2e5,
∑∣ti
∣≤2
e5,∣
s∣≤1
e6題目思路:
模板+優化。
其實我們可以發現ac自動機在查詢的時候,是對於每個狀態都暴力跳fai
lfail
fail
了的.但是這樣的最差複雜度顯然是平方級別了的。所以這個題目要求我們優化這乙個點。
其實優化的核心在於,減少重複計算。什麼意思呢?
假設我們在遍歷模式串的時候,重複到達了x
xx節點多次。那麼每次都需要暴力跳多次x
xx的fai
lfail
fail
鏈。每次+1+1
+1.但是我們完全可以在最後遍歷完整個模式串之後一起下放標記的。
那麼自然就想到了,先打標記,之後再逆著bui
ld
build
build時bfs
bfsbf
s的順序來下放標記。最後遍歷自動機得到答案.
#include
using
namespace std;
#define ll long long
#define pii pair
#define pb push_back
const
int maxn =
2e6+5;
const
int maxm =
2e6+5;
const
int mod =
1e9+7;
int res[maxn]
;namespace ac
e[u]
.push_back
(id);}
void build ()}
}void ask (
char
* s)
}void getans ()}
}char a[maxm]
;int
main()
ac::
build()
;scanf
("%s"
, a)
; ac::
ask(a)
; ac::
getans()
;for
(int i =
1; i <= n ; i++
)return0;
}
洛谷P5357 AC自動機模板題
p5357 對應輸出n個模式串在文字串 現的次數 ac自動機?坑點 可能出現重複模板串,所以標記結尾時做相應的修改即可 這裡的寫法是把fail樹對應的圖建出來了,其實不需要建也可以求出 這不重要 void getans void include using namespace std typedef...
洛谷 5357 模板 AC自動機(二次加強版)
題目描述 給你乙個文字串 s 和 n 個模式串 t 1.n t t1 n 請你分別求出每個模式串 t it i ti 在 s 現的次數。輸入格式 第一行包含乙個正整數 n 表示模式串的個數。接下來 n 行,第 i 行包含乙個由小寫英文本母構成的字串 t it i ti 最後一行包含乙個由小寫英文本母...
P5357 模板 AC自動機(二次加強版)
題目大意 給n個模式串和乙個主串,分別輸出每個模式串在主串 現過幾次 題目思路 ac自動機模板題,ac自動機就是先建乙個字典樹,然後建fail指標,建fail的時候如果是模式串中給的字元,就建fail,否則就繼承之前的fail情況,這是為了以後不用跳fail能直接得到想要的值。接著就是最精華的地方,...