#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int M =1010000;
char s[M],t[M],c;
int len,p[M]; // p[i] 以i为中心的回文 i到最右端长度
void Init()
{
int i;
t[0]='@';
for(int i=1;i<=2*len;i+=2)
{
t[i]='#';
t[i+1]=s[i/2];
}
t[2*len+1]='#';
t[2*len+2]='$';
t[2*len+3]=0;
len=2*len+1;
}
void Manacher()
{
int mx=0,ans=0,po=0,l,r;
for(int i=1;i<=len;i++)
{
if(i<mx)
{
//i关于po对称 j=2*po-i
//p[i]>=p[j] p[j]超过po的范围 则p[i]对应的超出范围 尚未匹配无法判断
p[i]=min(p[2*po-i],mx-i);
}
else
{
p[i]=1;
}
while(t[i-p[i]]==t[i+p[i]])
{
p[i]++;
}
if(i+p[i]>mx)
{
mx=i+p[i];
po=i;
}
if(ans<p[i])
{
ans=p[i];
l=(i-p[i])/2;//记录原串左右位置
r=(i+p[i])/2-2;//
}
}
// t中'#'个数比原串s长度始终大一 t的长度为 x+x-1=2*p[i]-1; 原串s长度为 p[i]-1
ans--;
if(ans<2)
{
cout<<"No Solution!"<<endl;
return;
}
cout<<l<<" "<<r<<endl;
c=c-'a';//后退c个
for(int i=l;i<=r;i++)
{
s[i]-=c;
if(s[i]<'a')
s[i]+=26;
cout<<s[i];
}
cout<<endl;
}
int main()
{
while(cin>>c)
{
scanf("%s",s);
len=strlen(s);
Init();
Manacher();
}
return 0;
}
hdu 3294 Manacher模版题
最新推荐文章于 2020-07-24 19:41:20 发布