#include <iostream>
#include <string.h>
using namespace std;
void getnext(int *next,char *q)
{
int j=0,k=-1;
next[0]=-1;
while(j<strlen(q)-1)
{
if(k==-1||q[j]==q[k])
{
j++;
k++;
next[j]=k;
}
else
{
k=next[k];
}
}
}
void kmp(char* p, char* q,int *loc,int *next,int &num)
{
int lenp=strlen(p);
int lenq=strlen(q);
int i=0,j=0; //j为子串下标
while(i<=lenp-1) //i表示主串的下标,主串需要跑完所有字母,最后一个字母下标为lenp-1
{
if(j==-1||p[i]==q[j]) //j==-1||
{
if(j==lenq-1) //-1
{
loc[num++]=i+1-lenq; //此时i和j都指向“abc”的“c”,而需要记录的是“a”的下标
j=0;
}
i++;
j++;
}
else
{
j=next[j];
}
}
}
int main()
{
char *p="abcdabcaabc";
char *q="abc";
int next[15]={0};
int loc[15]={0};
getnext(next,q);
int num=0;
kmp(p,q,loc,next,num);
for(int i=0;i<num;i++)
cout<<loc[i]<<" ";
system("pause");
return 0;
}