剪花布條
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14793 Accepted Submission(s): 9376
題目大意:給定字符串a和b,求b在a中出現的次數
思路:KMP算法模板題,只不過在kmp時,返回的不是b在a中出現的起始位置,應該改成答案(ans)加一,然後把j置爲0,繼續比對
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#define LL long long
using namespace std;
const int maxn = 1000+5;
int ans,Next[maxn];
void getNext(string s)
{
int ls=s.size();
Next[0]=-1;
Next[1]=0;
for(int i=2;i<=ls;i++){
if(s[i-1]==s[Next[i-1]]) Next[i]=Next[i-1]+1;
else{
int t=Next[i-1];
while(s[i-1]!=s[t]){
t=Next[t];
if(t==-1) break;
}
Next[i]=t+1;
}
}
}
void kmp(string a,string b)
{
getNext(b);
int la=a.size(),i=0;
int lb=b.size(),j=0;
while(i<la && j<lb){
if(j==-1 || a[i]==b[j]) i++,j++;
else j=Next[j];
if(j==lb) ans++,j=0;
}
}
int main()
{
cin.sync_with_stdio(false);
string a,b;
while(cin>>a){
if(a[0]=='#') break;
cin>>b;
ans=0;
kmp(a,b);
cout<<ans<<endl;
}
return 0;
}