您的位置:首页 > 其它

【Ural 1297】Palindrome manacher 最长回文子串

2017-03-17 19:16 369 查看

题目描述

The “U.S. Robots” HQ has just received a rather alarming anonymous letter. It states that the agent from the competing «Robots Unlimited» has infiltrated into “U.S. Robotics”. «U.S. Ro…………

题目大意

↑题目描述不是重点,题目大意就是求最长的回文子串,如果有长度相同的则输出最靠前的。

数据范围

长度小于20W,均为大写或小写字母。

样例输入

ThesampletextthatcouldbereadedthesameinbothordersArozaupalanalapuazorA

样例输出

ArozaupalanalapuazorA

解题思路

manacher模板题

代码

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
int p[400005];
char s[400005];
int main(){
cin>>s;
int len=strlen(s),id=0,ce,MaxLen=0;
for(int i=len-1;i+1;i--){
s[i+i+1]=s[i];
s[i+i+2]='#';
}
s[0]='#';
s[2*len]='^';
for(int i=1;i<=len*2;i++){
if(id+p[id]>i)p[i]=min(p[id+id-i],p[id]+id-i);
else p[i]=0;
while(s[i-p[i]]==s[i+p[i]])p[i]++;
if(p[i]+i>p[id]+id){id=i;}
if(p[id]>MaxLen){
MaxLen=p[id];
ce=i;
}
}
for(int i=ce-p[ce]+1+(s[ce-p[ce]+1]=='#');i<=ce+p[ce]-1;i+=2)
cout<<s[i];
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: