有一些字串(互不相同),求哪些字串在乙個大字串**現的次數最多。
如果沒看過簡單版的就點我看普通的。
這道題變了一下,從求有多少個字串出現過,變成了求哪些字串出現的次數最多。
那還記得我們之前要記錄這個字串是否出現過嗎?
沒錯,我們就從這裡改一下,就我們可以記錄這個型別的字串包含了哪幾個,然後就每次發現這種字串出現在大字串一次,就給每乙個字串統計一次。
然後最後找最大值,就可以了。
不過好像也可以把相同的字串合成乙個,然後最後變回去就可以,好像記憶體空間還小一點。
#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,...