用蛮力法求的next数组:
额首先要知道next数组就是模式串最长真前缀真后缀的长度
#include<iostream>
#include<cstring>
using namespace std;
void GetNext(char T[],int next[]){
int i,j,len;
next[0]=-1;
next[1]=0;//第二个字符前只有一个字符,所以真前缀真后缀长度为0
for(int i=2;T[i]!='\0';i++){//i=2开始 前面真前缀真后缀长度就可能>=1了
for(len=i-1;len>0;len--){//从最长的开始找 真前缀真后缀长度从i-1递减
for(j=0;j<len;j++){//j从0到len-1 真前缀真后缀的长度不超过len-1
if(T[j]!=T[i-len+j])break;//依次比较真前缀和真后缀的每一个字符(真前缀从0开始 真后缀从i-len开始)
}
if(j==len){
next[i]=len;break; //第一次居然少了个break;
}
}
if(len<1)next[i]=0;
}
}
int KMP(char a[],char b[],int next[]){
int i=0,j=0;
while(a[i]!='\0'&&b[j]!='\0'){
if(a[i]==b[j]){i++;j++;}
else{
j=next[j];
if(j==-1){i++;j++;}
}
}
if(b[j]=='\0')return i-strlen(b)+1;
return -1;
}
int main(){
char a[1000],b[100];
int next[100];
cin>>a>>b;
GetNext(b,next);
cout<<KMP(a,b,next);
return 0;
}