H - Prefix-Suffix Palindrome (Hard version) CodeForces - 1326D2(马拉车)

H - Prefix-Suffix Palindrome (Hard version) CodeForces - 1326D2

题目链接

思路

  • 分析:首先对字符串进行前后一一匹配,把匹配剩下的拿出来跑一边 Manacher(注意字符串的数组开的大小,比赛的时候因为这个真是T到吐血

代码

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
void fre() { freopen("A.txt","r",stdin); freopen("Ans.txt","w",stdout); }
const int mxn = 5e6 + 10;

char ar[mxn], br[mxn], cr[mxn];
int len[mxn];
int is_front;

int trans(int lbr)
{
    int cnt = 0;
    cr[cnt ++] = '$';
    for(int i = 1; i <= lbr; i ++)
    {
        cr[cnt ++] = '#';
        cr[cnt ++] = br[i];
    }
    cr[cnt ++] = '#';
    cr[cnt] = '%';
    return cnt;
}

int Manacher(int lcr)
{
    int mid = 0, mr = 0;
    int mx = 0;
    for(int i = 1; i < lcr; i ++)
    {
        if(i < mr) len[i] = min(mr - i, len[2*mid - i]);
        else len[i] = 1;
        while(cr[i - len[i]] == cr[i + len[i]]) len[i] ++;
        if(mr < i + len[i])
        {
            mr = i + len[i];
            mid = i;
        }
        if(mx < len[i] && (i - len[i] == 0 || i + len[i] == lcr))
        {
            mx = len[i];
            if(i - len[i] == 0)
                is_front = 1;
            else 
                is_front = 0;
        }
    }
    return mx - 1;
}



int main()
{
    /* fre(); */
    int t;
    scanf("%d", &t);
    while(t --)
    {
        memset(len, 0, sizeof(0));
        scanf("%s", ar + 1);
        int lar = strlen(ar + 1);
        int l = 1, r = lar;
        while(l < r && ar[l] == ar[r])
            l ++, r --;
        int lbr = 0;
        for(int i = l; i <= r; i ++)
            br[++ lbr] = ar[i];
        int mx = Manacher(trans(lbr));
        for(int i = 1; i < l; i ++)
            printf("%c", ar[i]);
        if(is_front)
        {
            for(int i = 1; i <= mx; i ++)
                printf("%c", br[i]);
        }
        else
        {
            for(int i = lbr - mx + 1; i <= lbr; i ++)
                printf("%c", br[i]);
        }

        for(int i = r + 1; i <= lar; i ++)
            printf("%c", ar[i]);
        printf("\n");
    }

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/lql-nyist/p/12735742.html