#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 1024
//原版的next数组
void get_next(char *s,int next[])
{
int l=strlen(s);
int j=0;
int k=-1;
next[0]=-1;
while(j<l-1)
{
if(k==-1||s[j]==s[k])
{
j++;
k++;
next[j]=k;
}
else
k=next[k];
}
}
//优化后的next数组
void get_next2(char *s,int next[])
{
int l=strlen(s);
int j=0;
int k=-1;
next[0]=-1;
while(j<l-1)
{
if(k==-1||s[j]==s[k])
{
j++;
k++;
if(s[j]==s[k])
next[j]=next[k];
else
next[j]=k;
}
else
k=next[k];
}
}
int kmp(char *s,char *t)
{
int l1=strlen(s);
int l2=strlen(t);
int *next=(int *)malloc(sizeof(int)*l2);
int m;
//get_next(t,next);
get_next2(t,next);
for(m=0;m<l2;m++)
printf("%d ",next[m]);
printf("\n");
int i=0;
int j=0;
while(i<l1&&j<l2)
{
if(j==-1||s[i]==t[j])
{
i++;
j++;
}
else
j=next[j];
printf("i:%d j:%d\n",i,j);
}
free(next);
if(j>=l2)
return i-l2;
else
return -1;
}
int main()
{
char str1[64]="aabaabaabaaab!";
char str2[64]="aaab";
printf("%d\n",kmp(str1,str2));
return 0;
}