洛谷P5357 AC自動機 二次加強版

2021-10-12 12:24:42 字數 1424 閱讀 2626

題目大意:

給你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能直接得到想要的值。接著就是最精華的地方,...