模板 AC自動機(加強版)

2021-10-12 19:55:26 字數 1488 閱讀 5776

有一些字串(互不相同),求哪些字串在乙個大字串**現的次數最多。

如果沒看過簡單版的就點我看普通的。

這道題變了一下,從求有多少個字串出現過,變成了求哪些字串出現的次數最多。

那還記得我們之前要記錄這個字串是否出現過嗎?

沒錯,我們就從這裡改一下,就我們可以記錄這個型別的字串包含了哪幾個,然後就每次發現這種字串出現在大字串一次,就給每乙個字串統計一次。

然後最後找最大值,就可以了。

不過好像也可以把相同的字串合成乙個,然後最後變回去就可以,好像記憶體空間還小一點。

#include

#include

#include

#include

using

namespace std;

struct node tree[

20001];

int n, size, now, thi, maxx[

151]

, maxn, sum[

151]

, noww, kk;

char c[

1000001

], every[

151][71

];void

gettrie

(int nowww)

tree[now]

.num[

++tree[now]

.num[0]

]= nowww;

//記錄哪些字串是同乙個

}void

get_fail()

while

(!q.

empty()

)else tree[now]

.son[i]

= tree[tree[now]

.fail]

.son[i];}

}}void

get_ac()

else

if(sum[tree[noww]

.num[j]

]== maxn)

}

noww = tree[noww]

.fail;}}

}bool

cmp(

int x,

int y)

intmain()

get_fail()

;scanf

("%s"

,&c)

;get_ac()

;printf

("%d\n"

, maxn)

;sort

(maxx +

1, maxx + maxx[0]

+1, cmp)

;for

(int i =

1; i <= maxx[0]

; i++

)scanf

("%d"

,&n);}

return0;

}

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

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

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...

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

嘟嘟嘟 這個和某谷的ac自動機模板簡單版差不多。但還是要注意幾點的 1.這個是統計出現次數,而不是是否出現,所以在查詢的時候加上這個節點的val後,不能把val標記為 1。那麼也就可以說查詢的時間複雜度能比簡單版的稍微第一慢一點。2.考慮k個一樣的模式串 剛開始我想的是每乙個節點開乙個vector,...