HDU - 2087 剪花布条 两种做法 KMP+循环
https://vjudge.net/problem/HDU-2087
题目

分析

AC代码KMP
#include<iostream>
using namespace std;
const int N=1000+10;
int n,m;
int ne[N];
string s,p;
int main()
{
while(cin>>s)
{
if(s=="#") break;
cin>>p;
n=s.size();
m=p.size();
ne[0]=-1;
for(int i=0,j=-1;i<=m;)
{
if(j==-1 || p[i]==p[j])
{
i++,j++;
ne[i]=j;
}
else
j=ne[j];
}
int ans=0;
for(int i=0,j=0;i<=n;)
{
if(j<0 || s[i]==p[j])
{
j++; i++;
}
else
j=ne[j];
if(j==m)
{
ans++;
j=0; //这里不再是后退到最近的 而是从头开始 因为剪掉了就没有了 不能重复
}
}
printf("%d\n",ans);
}
return 0;
}
AC代码循环
#include<iostream>
#include<string>
using namespace std;
int main()
{
int i,j;
string a,b;
while(cin>>a)
{
if(a=="#") break;
cin>>b;
int ans=0;
for(i=0,j=0;i<a.size();i++)
{
if(a[i]==b[j])
{
j++;
if(j==b.length())//一旦出现str1,a++
{
ans++;
j=0;
}
}
else
{
i-=j;
j=0;
}
}
cout<<ans<<endl;
}
return 0;
}
本文来自博客园,作者:斯文~,转载请注明原文链接:https://www.cnblogs.com/zhiweb/p/15483327.html

浙公网安备 33010602011771号