kmp刷題記錄

2021-10-18 20:22:55 字數 2055 閱讀 8456

給定乙個字串 a 和乙個字串 b,求 b 在 a 中的出現次數。

a 中不同位置出現的 b 可重疊,詳見樣例

二、四。

輸入共兩行,分別是字串 a 和字串 b。

輸出乙個整數,表示 b 在 a 中的出現次數。

input

rachelahhhh

h

output

5
input

rachelahhhh

hh

output

3
input

rachelahhhh

hhh

output

2
input

zyzyzyz

zyz

output

3
模板題

#includeusing namespace std;

char a[1000090],b[1000090];

int next[1000090],cnt,len1,len2;

void getnext() }

void kmp() }}

int main() }

char ans[1000090];

int p[1000090];

int top=0;

void kmp()

}}int main()

乙個字串的字首是指包含該字元第乙個字母的連續子串,例如:abcd的所有字首為a, ab, abc, abcd。 給出乙個字串s,求其所有字首中,字元長度與出現次數的乘積的最大值。

例如:s = "abababa" 所有的字首如下:

"a", 長度與出現次數的乘積 1 * 4 = 4,

"ab",長度與出現次數的乘積 2 * 3 = 6,

"aba", 長度與出現次數的乘積 3 * 3 = 9,

"abab", 長度與出現次數的乘積 4 * 2 = 8,

"ababa", 長度與出現次數的乘積 5 * 2 = 10,

"ababab", 長度與出現次數的乘積 6 * 1 = 6,

"abababa", 長度與出現次數的乘積 7 * 1 = 7. 其中"ababa"出現了2次,二者的乘積為10,是所有字首中最大的

輸入字串t, (1 <= l <= 1000000, l為t的長度),t中的所有字元均為小寫英文本母。 (注意:原題是l <= 10w,這裡加強一下!)

輸出所有字首中字元長度與出現次數的乘積的最大值。

input

abababa
output

10
先求出這個字串自己的next陣列, 當掃到某乙個位置時,當前i的字首實際上出現次數加了一(前提是next[i]!=0),因為next表示最長字首和字尾,所以這個字首在字尾中也出現了一次

我們開乙個陣列記錄每乙個字首的出現次數,然後倒著掃瞄,避免重複

然後掃瞄時先把,num[i]+=1(它自己出現了一次了),在把num[next[i]]加上num[i],以next[i]為長度的字首每被它後面的i訪問時,都會作為一次字尾出現,所以要加上num[i];

#includeusing namespace std;

int next[1000070],n;

char s[1000600];

int cnt[1000600];

void getnext()

}int main()

long long ans=0;

for(int i=1;i<=n;i++)

ans=max(1ll*i*cnt[i],ans);

printf("%lld\n",ans);

return 0;

}

KMP做題記錄

題目太長不貼了 這道題很巧妙,給定乙個字串s,求最少在首尾新增幾個字元後,s變為乙個迴圈了n次的字串 n 1 假設我們有乙個迴圈串s abcabcabc 我們根據kmp求一次next陣列,就可以通過next strlen s 得到乙個迴圈節的位置從而求出迴圈節的長度,顯然,迴圈節能被s整除。如果s ...

OI刷題記錄

2014 4 18 poj3264 bzoj1699 balanced lineup rmq 2014 4 19 bzoj1012 jsoi2008 最大數maxnumber noi2004 鬱悶的出納員 bzoj3224 tyvj 1728 普通平衡樹 2014 4 20 bzoj1862 105...

面試刷題記錄

寫一段 判斷乙個包括 的表示式是否合法 注意看樣例的合法規則。給定乙個表示式a,請返回乙個bool值,代表它是否合法。測試樣例 a b 5 4 返回 true 測試樣例 a b 5 4 返回 false include vector include iostream using namespace ...