#include <iostream>
using namespace std;
void get_next(char T[],int next[]){
next[0]=-1;
int i,j,k;
for(j=1;T[j]!='\0';j++){//依次求next[j]
for(k=j-1;k>=1;k--){
for(i=0;i<k;i++){//依次比较T[0]~T[k-1]与T[j-k]~T[j-1],求最长的子串,即k的位置
if(T[i]!=T[j-k+i]){
break;
}
}
if(k==i){
next[j]=k;
break;
}
}
if(k<1){//其他情况,无相等子串
next[j]=0;
}
}
}
int strlen(char S[]){
int i=0;
while(S[i]!='\0'){
i++;
}
return i;
}
int KMP(char S[],char T[]){
int i=0,j=0;
int next[99];
get_next(T,next);
while(S[i]!='\0'&&T[j]!='\0'){
if(S[i]==T[j]){
i++;
j++;
}else{
j=next[j];
if(j==-1){
i++;j++;
}
}
}
if(T[j]=='\0'){
return (i-strlen(T)+1);
}else{
return 0;
}
}
int main()
{
char S[7]="abcabd";
char T[4]="abd";
cout<<KMP(S,T);
return 0;
}