题意:将字符串按规则转换,再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;
}