1.KMP算法next数组(最长公共前后缀)

int Next[maxn];
char s[maxn],t[maxn];
void restart()
{
    int i=-1,j=0;
    int len=strlen(s);
    Next[0]=-1;
    /***
         abababd
           abababd
    ***/
    while(j<len)
    {
        if(i==-1||s[i]==s[j])
        {
            i++;
            j++;
            Next[j]=i;
        }
        else
            i=Next[i];
    }
  /*  for(int i=0;i<len;i++)
        printf("%d ",Next[i]);*/
}

1(补).补上kmp:

   /***
        abadac
        abab
        当next[]为0时,说明没有相同的前后缀,也就是当前无法起作用,只能乖乖向后移.
        abadac
         abadac
   ***/
     int i=0;
    int j=0;
    int len1=strlen(s),len2=strlen(p);
    while(i<len1)
    {
        if(j==-1||s[i]==p[j])
        {
            i++;
            j++;
        }
        else
            j=nex[j];
        if(j==len2)
        {
            sum++;
            j=-1;
            i--;
        }
    }

2.Mannacher算法求最长回文字符串

int AC()
{
    cop[0]='&';
    int len=0;
    cop[++len]='#';
    for(int i=0;s[i];i++)
    {
        cop[++len]=s[i];
        cop[++len]='#';
    }
    cop[len+1]='\0';
    int id=1,mx=0,maxl=0;
    for(int i=1;i<=len;i++)
    {
        p[i]=mx>i?min(p[2*id-i],mx-i):1;
        while(cop[i-p[i]]==cop[i+p[i]]) ++p[i];
        if(mx<i+p[i])
        {
            mx=i+p[i];
            id=i;
        }
        maxl=max(maxl,p[i]-1);
    }
    return maxl;
}