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

2021-10-19 09:56:12 字數 1593 閱讀 4273

輸入樣例

2

ababab

ababababac

6beta

alpha

haha

delta

dede

tata

dedeltalphahahahototatalpha

0

輸出樣例
4

aba2

alpha

haha

其實還是ac自動機模板題(詳解在hdu2222有講),只要理解其核心ne陣列,還是比較簡單的,此題是讓求單詞在文章**現的次數,並輸出即可,這題要計算空間複雜度,開合適的大小。

ne陣列表示的是以某個點結尾的字尾所能匹配字典樹中的最長字首,那麼我們在文章中進行單詞匹配的過程,當有乙個單詞匹配成功後,那麼這個單詞所有的ne指向的位置,ne的ne指向的位置,都能匹配成功

這樣,我們只需在插入的時候,標記一下每個單詞結尾字母的節點編號,然後在文章匹配的過程中,每次匹配成功後,就通過剛才標記的節點編號來記錄每個單詞出現的次數,最後遍歷一下最大的值輸出即可

#include

#include

#include

#include

#include

using

namespace std;

const

int n =

160, m =

1e6+

10, k =

155*75;

int n;

char s[m]

;string str[n]

;int tr[k][26

], cnt[k]

, idx;

int q[k]

, ne[k]

;int id[k]

, res[n]

;int maxn;

void

insert

(int x)

cnt[p]++;

id[p]

= x;

//標記一下每個單詞結尾字母的節點編號

}void

build()

while

(hh <= tt)}}

}int

main()

build()

; cin >> s;

for(

int i =

0, j =

0; s[i]

; i++)}

for(

int i =

1; i <= n; i++

) maxn =

max(res[i]

, maxn)

; cout << maxn << endl;

for(

int i =

1; i <= n; i++)}

}return0;

}

P3796 模板 AC自動機

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

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

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

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

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