【kmp算法】模板

void GetFail(char P[],int __next[])//__next[i]表示s[0]~s[i-1]的前缀中,最大长度相等的前后缀是多少 
{
    __next[0]=-1;
    int len=strlen(P);
    for(int i=0;i<len;i++)
      {
        int j=__next[i];
        while(j>=0&&P[i]!=P[j])
		  j=__next[j];
        if(j!=-1 && P[i]==P[j])
		  __next[i+1]=j+1;
        else __next[i+1]=0;
      }
}
int find(char T[],char P[],int __next[])
{
    int n=strlen(T),m=strlen(P);
    GetFail(P,__next); int j=0;
    for(int i=0;i<n;++i)
      {
        while(j&&P[j]!=T[i]) j=__next[j];//如果j变成0仍不能满足P[j]==T[i],则只增加i直到出现P[j]==T[i]为止。
        if(P[j]==T[i]) ++j;
        if(j==m) return i-m+1;
      }
    return -1;
}
posted @ 2014-12-27 14:46  AutSky_JadeK  阅读(181)  评论(0编辑  收藏  举报
TVアニメ「Charlotte(シャーロット)」公式サイト TVアニメ「Charlotte(シャーロット)」公式サイト