/*找出所有和模式串匹配的字符串的起始下标*/
#include <iostream>
using namespace std;
void getNext(char *p,int *next)
{
int j,k;
next[0]=-1;
j=0;
k=-1;
while(j<strlen(p)-1)
{
if(k==-1||p[j]==p[k]) //匹配的情况下,p[j]==p[k]
{
j++;
k++;
next[j]=k;
}
else //p[j]!=p[k]
k=next[k];
}
}
void getNextA(char *p,int *next)
{
next[0]=-1;
next[1]=0;
for (int i=2;i<=strlen(p);i++)
{
int j=i-1;
int k=next[j];
while (true)
{
if (p[i-1]==p[k])
{
next[i]=next[j]+1;
break;
}
else
{
if (k==0)
{
next[i]=0;
break;
}
else
{
j=k;
k=next[j];
}
}
}
}
}
void main()
{
char* str="acac";
int a[100];
getNextA(str,a);
for (int i=0;i<=strlen(str);i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
char* detstr="acacacacbacacacacb";
i=0;int j=0;
while(i<strlen(detstr))
{
if (j==strlen(str))
{
cout<<i-strlen(str)<<endl;
j=a[j];
}
if (detstr[i]==str[j])
{
i++;j++;
}
else
{
j=a[j];
if (j==-1)
{
i++;
j=0;
}
}
}
if (j==strlen(str))
{
cout<<i-strlen(str)<<endl;
}
}