給定乙個字串 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 ...