* next数组的构造 */
/*通过计算返回的子串T的next数组*/
using namespace std;
void get_next(string T,int * next)
{
int i,j;
i=0;
j=-1;
next[0]=-1;
int lenT=T.length();
while(i<lenT)
{
if(j==-1 || T[i]==T[j])
{
++i;
++j;
next[i]=j;
}
else
{
j=next[j];
}
}
}
/*返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回-1*/
int index_KMP(string S,string T,int pos)
{
int i=pos;
int j=0;
int lenS=S.length();
int lenT=T.length();
int next[255];
get_next(T,next);
while(i<lenS && j<lenT)
{
if(j==0 || S[i]==T[j])
{
++i;
++j;
}
else
{
j=next[j];
}
}
if(j>=lenT)
{
return i-lenT;
}
else
{
return -1;
}
}
int main()
{
string S="abcdefg";
string T="efg";
int index=index_KMP(S,T,0);
cout<<index<<endl;
return 0;
}
