hdu 3294 Girls' research

题意:将字符串按规则转换,再manacher

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;

char s[200005], s_new[400010];
int len,p[400010];

int init()
{
    s_new[0] = '$';
    s_new[1] = '#';
    int j = 2;
    for(int i = 0; i < len; i++)
    {
        s_new[j++] = s[i];
        s_new[j++] = '#';
    }
    s_new[j] = '\0';
    return j;
}

int manacher()
{
    int len = init();
    int max_len = -1;
    int id = 0,mx = 0;
    for(int i = 1; i < len; i++)
    {
        p[i] = mx > i?min(p[2*id-i],mx-i):1;
        while(s_new[i-p[i]] == s_new[i+p[i]])
            p[i]++;
        if(i + p[i] > mx)
        {
            id = i;
            mx = i + p[i];
        }
        max_len = max(max_len,p[i] - 1);
    }
    return max_len;
}

int main()
{
    char c;
    while(~scanf("%c%s",&c,s))
    {
        getchar();
        len = strlen(s);
        for(int i = 0; i < len; i++)
            s[i] = (s[i] - c + 26)%26 + 'a';
        int cnt = init(),tmp = manacher();
        int ans;
        if(tmp < 2)
            printf("No solution!\n");
        else
        {
            for(int i = 0; i < cnt; i++)
            {
                if(p[i]-1 == tmp)//寻找最先出现回文串的位置
                {
                    ans = i;
                    break;
                }
            }
            int a = (ans - tmp)/2,b = (ans + tmp)/2 - 1;//找出回文串在对应转换后的字符串中的位置
            printf("%d %d\n",a,b);
            for(int j = a;j <= b;j++)
                printf("%c",s[j]);
            printf("\n");
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/feynmanz/article/details/80398328