[Template] EKMP, Manachar algorithm

Expand KMP

Expand KMP

void pre_EKMP(char x[], int m)
{
    Next[0] = m;
    int j = 0;
    while(j+1<m && x[j] == x[j+1] ) j++;
    Next[1] = j;
    int k = 1;
    for(int i=2; i<m; i++){
        int p = Next[k] + k - 1;
        int L = Next[i-k];
        if(i+L < p+1) Next[i] = L;
        else{
            j = max(0, p-i+1);
            while(j+i < m && x[i+j]==x[j]) j++;
            Next[i] = j;
            k = i;
        }
    }
}

//next[i]:x[i...m-1] 与 x[0...m-1] 的最长公共前缀
//extend[i]:y[i...n-1] 与 x[0...m-1] 的最长公共前缀

void EKMP(char x[], int m, char y[], int n)
{
    pre_EKMP(x, m);
    int j = 0;
    while(j<n && j<m && x[j]==y[j]) j++;
    ext[0] = j;
    int k = 0;
    for(int i=1;i<n;i++)
    {
        int p = ext[k]+k-1;
        int L = Next[i-k];
        if(i+L < p+1) ext[i] = L;
        else{
            j = max(0, p-i+1);
            while(i+j<n && j<m && y[i+j]==x[j]) j++;
            ext[i] = j;
            k = i;
        }
    }
}

Nancr

Nancr

char s[maxn];
char str[maxn];
int len;
int p[maxn];

void getstr()
{
    int k = 0;
    str[k++] = '@';
    len = (int)strlen(s);
    for(int i=0;i<len;i++)
    {
        str[k++] = '#';
        str[k++] = s[i];
    }
    str[k++] = '#';
    len = k;
    str[k] = 0;
}

void manncher()
{
    int mx = 0, id = 0;
    int maxx = 0;
    for(int i=0;i<len;i++)
    {
        if(mx>i) p[i] = min(mx-i, p[2*id-i]);
        else p[i] = 1;
        while(str[i+p[i]]==str[i-p[i]]) p[i]++;
        if(p[i]+i>mx)
        {
            mx = p[i] + i;
            id = i;
        }
    }
}
  • p[i]-1In the center is the largest here run length palindrome
  • Subscript string is started palindrome(i-p[i])/2
Published 35 original articles · won praise 15 · views 1087

Guess you like

Origin blog.csdn.net/irimsky/article/details/104043989