生活随笔
收集整理的這篇文章主要介紹了
                                
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的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。