这个题目现在是用manacher线性算法写的,后缀数组版本的还没实现,打算过两天搞定
还是觉得这个算发搞定回文问题既好写又快
pos*2-i这个就是求i位置关于pos的一个对称点,本质上是这样的 pos-(i-pos);
i-pos是i相对pos偏右的距离
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
#define MIN(a,b) (a<b?a:b)
char str[2500];
char rec[2500];
int drome[2500];
int main()
{
int i,j,k;
int max_pos,pos;
while(scanf("%s",rec)!=EOF)
{
k=0;
str[k++]='@';
for(i=0;rec[i];i++)
{
str[k++]='#';
str[k++]=rec[i];
}
str[k++]='#';
str[k]=0;
drome[0]=1;
max_pos=0;
pos=0;
for(i=1;str[i];i++)
{
if(max_pos > i)
{
drome[i]=MIN(drome[pos*2-i],max_pos-i);
}
else
drome[i]=1;
for( ;str[i+drome[i]]==str[i-drome[i]];drome[i]++) ;
if(i+drome[i] > max_pos)
pos=i,max_pos=drome[i]+i;
}
max_pos=-1;
pos=0;
for(j=0;j<i;j++)
{
if(drome[j] > max_pos)
{
max_pos=drome[j];
pos=j;
}
}
// printf("MAX:%d\n",max_pos);
max_pos;
k=pos-max_pos+1;
pos+=max_pos-1;
for(k;k<pos;k++)
if(str[k]!='#')
printf("%c",str[k]);
printf("\n");
}
return 0;
}
本文介绍了一种利用Manacher线性算法解决回文问题的方法,通过后缀数组进一步优化。文中详细解释了核心算法原理,包括如何计算每个字符的对称点及其在字符串中的位置,并提供了代码实现细节。
293

被折叠的 条评论
为什么被折叠?



