#include <stdio.h>
#define MAXLEN 255
typedef struct{
char ch[MAXLEN+1];
int length;
}SString;
//void get_next(SString T,int next[]){
// int i=1;
// next[1]=0;
// int j=0;
// while(i<T.length-1){
// if(j==0||T.ch[i]==T.ch[j]){
// ++i;
// ++j;
// next[i]=j;
// }else{
// j=next[j];
// }
// }
//}
void get_nextval(SString T,int nextval[]){
int i=1;
nextval[1]=0;
int j=0;
while(i<T.length-1){
if(j==0||T.ch[i]==T.ch[j]){
++i;
++j;
if(T.ch[i]!=T.ch[j]){
nextval[i]=j;
}else{
nextval[i]=nextval[j];
}
}else{
j=nextval[j];
}
}
}
int Index_KMP(SString S,SString T,int pos){
int i=pos;
int j=1;
int next[T.length];
while(i<=S.length&&j<=T.length){
if(S.ch[i]==T.ch[j]){
++i;
++j;
}else{
j=next[i];
}
}
if(j>=T.length){
return i-T.length;
}else{
return 0;
}
}
int main(){
SString S={"abacadabrac",11};
SString T={"adabr",4};
int pos=1;
int index=Index_KMP(S,T,pos);
if(index!=0){
printf("在位置%d出找到匹配\n",index);
}else{
printf("未找到匹配\n");
}
return 0;
}