輸入樣例
2輸出樣例ababab
ababababac
6beta
alpha
haha
delta
dede
tata
dedeltalphahahahototatalpha
0
4aba2
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 行,每行乙個...