生活随笔
收集整理的這篇文章主要介紹了
zcmu-1953
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1953: #103. 子串查找
Time Limit: 5 Sec Memory Limit: 256 MB
Submit: 112 Solved: 46
[Submit][Status][Web Board]
Description
這是一道模板題。
給定一個字符串 A 和一個字符串 B,求 B 在 A 中的出現次數。
A 中不同位置出現的 B 可重疊。
Input
輸入共兩行,分別是字符串 A 和字符串 B。
Output
輸出一個整數,表示 B 在 A 中的出現次數。
Sample Input
zyzyzyz
zyz
Sample Output
3
HINT
1≤A,B 的長度 ≤106 ,A 、B 僅包含大小寫字母。
思路:題目要求的時間為5秒,這里可以想到srting類的find()函數,時間上5秒夠了,但是還是wa幾次,沒理解到find()函數其實是在找子串的時候,從i個位置開始,比如i=100;要是沒找到就跳出循環,因為接下去的再也找不到了,果然還是自己對函數理解不透徹。
另外一個做法是kmp算法,時間耗時小,比較推薦。kmp算法有模板。套一下模板就成了。
ac代碼:
string的find()函數;
#include<bits/stdc++.h>
using namespace std;
int main()
{
string a;
string b;
while(
cin>>a){getchar();
cin>>b;
int n=a.size();
int m=b.size();
int i=
0,count=
0;
while(
1){i=a.find(b,i);
if(i==-
1)
break;
if(i!=-
1)count++;i++;}
cout<<count<<endl;}
return 0;
}
kmp算法:
#include<iostream>
#include<cstdio>
#include<cstring>using namespace std;
const int N=
1000001;
char a[N],b[N];
int la,lb;
int p[N];
int ans;
void makep()
{
int j=
0;p[
0]=
0;
for(
int i=
1;i<lb;i++){
while(j>
0&&b[j]!=b[i])j=p[j-
1];
if(b[j]==b[i])j++;p[i]=j;}
}
void KMP()
{
int j=
0;
for(
int i=
0;i<la;i++){
while(j>
0&&b[j]!=a[i])j=p[j-
1];
if(b[j]==a[i])j++;
if(j==lb)ans++,j=p[j-
1];}
printf(
"%d",ans);
}
int main()
{
scanf(
"%s %s",a,b);la=
strlen(a);lb=
strlen(b);makep();KMP();
return 0;
}
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的zcmu-1953的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。