kmp暴力求解飘过,,,
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
string a,b;
int nex[6];
void kmp()
{ int n;
n=b.size();
nex[0]=0;
int i=0,j=1;
while(j<n)
{ if(b[j]==b[i])
{nex[j]=i+1;
i++;j++;
}
else { if(i>0) i=nex[i-1];
else nex[j++]=0;
}
}
}
int main()
{ int Case;
cin>>Case;
while(Case--)
{ cin>>a>>b;
memset(nex,0,sizeof(nex));
kmp();
int n=a.size();
int m=b.size();
int num=0;
int i=0,j=0;
while(i<n)
{
if(a[i]==b[j])
{
if(j==m-1) {num++;i++;j=0;}
else {i++;j++;}
}
else{ if(j>0) j=nex[j-1];
else i++;
}
}
cout<<num<<endl;
}return 0;
}
直接方法:
#include<string.h>
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{ int Case;
cin>>Case;
while(Case--)
{ char a[1000005];
char b[6];
scanf("%s%s",a,b);
int n=strlen(a);
int m=strlen(b);
bool flag;
int num=0;
for(int i=0;i+m-1<n;++i)
{ flag=true;
for(int j=0;j<m;++j)
if(a[i+j]!=b[j])
{ flag=false;break;}
if(flag) {num++;i+=m-1;}
}
cout<<num<<endl;
}return 0;
}