#include <stdio.h>
void ClearString(char s[])
{
int i=0;
while(s[i]!='\0')
{
s[i] = '\0';
i++;
}
}
int StrLength(char s[])
{
int i=0;
while(s[i]!='\0')
i++;
return i;
}
void get_next(char T[],int *next)
{
int i,j;
i=1;
j=0;
next[1]=0;
while(i<T[0])
{
if(j==0 || T[i]==T[j])
{
++i;
++j;
next[i]=j;
}
else
j=next[j];
}
}
void get_nextval(char T[],int *nextval)
{
int i,j;
i=1;
j=0;
nextval[1]=0;
while(i<T[0])
{
if(j==0||T[i]==T[j])
{
i++;
j++;
if(T[i]!=T[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
j=nextval[j];
}
}
int Index_KMP(char s[],char T[], int pos)
{
int i=pos;
int j=1;
int next[255];
get_next(T,next);
while(i<=s[0]&&j<=T[0])
{
if(j==0 ||s[i]==T[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j>T[0])
return i-T[0];
else
return 0;
}
int StrInsert(char s[],char T)
{
int j,i;
j=StrLength(s);
while(j>0)
{
s[j]=s[j-1];
j--;
}
s[0]=T;
return 1;
}
int main()
{
char T[100],s[100];
int m;
printf("输入字符串T");
gets(T);
char c=StrLength(T);
StrInsert(T,c);
printf("输入主串S");
gets(s);
m=Index_KMP(s,T,0);
printf("第一个相同的子串的第一个字符下标为%d",m);
return 0;
}