manacher最长回文序列c++

#include <iostream>
#include<string>
#include<cstring>

using namespace std;
char * pre(char *str)
{
    int length = strlen(str);
    char *prestr = new char[2*length + 4];
    prestr[1] = '$';
    for(int i=0;i<length;i++)
    {
        prestr[2*(i+1)] = '#';
        prestr[2*(i+1)+1] = str[i];
    }
    prestr[2*length+2]='#';
    prestr[2*length+3]='\0';
    return prestr;
}
int getMaxSym3(char *str)
{
    char *prestr = pre(str);
    int mx =0, pi=1;//边界和对称中心
    int len = strlen(prestr);
    //辅助数组
    int *p = new int[len];
    p[0] = 0;
    for(int i=1;i<len;i++)
    {
        if(mx>i)
        {
            p[i]=min(mx-i,p[2*pi-i]);//核心
        }
        else
        {
            p[i]=1;
        }
        while(prestr[i-p[i]]==prestr[i+p[i]]&&i-p[i]>0&&i+p[i]<len)
        {
            p[i]++;
        }
        if(i+p[i] > mx)
        {
            mx = p[i] + i;
            pi = i;
        }
    }
    //最大回文字符串长度
    int maxlen = 0;
    for(int i=0;i<len;i++)
    {
        if(p[i]>maxlen)
        {
            maxlen = p[i];
        }
    }
    delete []prestr;
    delete []p;
    return maxlen - 1;
}
int main()
{
    string str="sdghfjkghkdfjdfghjklkjhgfdsawtery";
    int m=str.length();
    char arr[m];
    for(int i=0;i<m;i++)
    {
        arr[i]=str[i];
    }
    int counts=getMaxSym3(arr);
    cout<<counts<<endl;
    return 0;
}

 

posted on 2016-09-12 21:24  邗影  阅读(304)  评论(0编辑  收藏  举报

导航