int kmp(sstring S,sstring T,int pos)
{
int i=pos,j=1;
while(i<=S.length&&j<=T.length)
{ if(j==0||S.ch[i]==T.ch[j])
{i++;j++;}
else j=next[j];
}
if(j>T.length) return i-T.length;
else return 0;
}
void getnext(sstring T,int next[])
{
int i=1,j=0;next[1]=0;
while(i<T.length)
{
if(T.ch[i]==T.ch[j]||j==0)
{i++;j++;next[i]=j;}
else
j=next[j];
}
}
void getnextval(sstring T,int nextval[])
{
int i=1,j=0;nextval[1]=0;
while(i<T.length)
{
if(T.ch[i]==T.ch[j]||j==0)
{
i++;j++;
if(T.ch[i]!=T.ch[j])
nextval[i]=j;
else nextval[i]=nextval[j];
}
else j=nextval[j];
}
}