////mp[i]:i右边第一个不能对称的位置j,mp[i]=j-i;
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
const int N=100010;
char ma[N*2];
int mp[N*2];
void Manacher(char *s,int len)
{
int l=0;
ma[l++]='$'; ma[l++]='#';
for(int i=0;i<len;i++)
{
ma[l++]=s[i]; ma[l++]='#';
}
ma[l]=0;
mp[0]=0;
int mx=1,id=0;
for(int i=1;i<l;i++)
{
mp[i]=(mx>i)?(min(mp[2*id-i],mx-i)):1;
while(ma[i+mp[i]]==ma[i-mp[i]]) mp[i]++;
if(i+mp[i]>mx)
{
mx=i+mp[i];
id=i;
}
}
}
int f(int x,int y)
{
int x1,y1;
x1=x*2+2;
y1=y*2+2;
int t=(y1+x1)/2;
if(t+(mp[t]-1)>=y1)return 1;
return 0;
}
char s[N];
int main()
{
while(scanf("%s",s)==1)
{
int len=strlen(s);
Manacher(s,len);
for(int i=0;i<2*len+2;i++)printf("%c ",ma[i])printf("\n");
for(int i=0;i<2*len+2;i++)printf("%d ",mp[i])printf("\n");
int ans=0;
for(int i=0;i<2*len+2;i++)
ans=max(ans,mp[i]-1);
printf("%d\n",ans);
}
return 0;
}
manacher
最新推荐文章于 2025-03-25 11:30:40 发布