字符串及數據結構定理與模板

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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章