luoguP3805 【模板】manacher算法
luoguP3805 【模板】manacher算法##
Time Limit: 1 Sec
Memory Limit: 512 MBDescription###
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
字符串长度为n
Input###
一行小写英文字符a,b,c...y,z组成的字符串S
Output###
一个整数表示答案
Sample Input###
aaa
Sample Output###
3
HINT
字符串长度len <= 11000000
题目地址:luoguP3805 【模板】manacher算法
题目大意: 题目很简洁了:)
题解:
模板题戳标记
dalao的解说
AC代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=11000005;
int n,ans,len[N+N];
char st[N],ch[N+N];
void modify(){
int len=0;
ch[++len]='$';
for(int i=1;i<=n;i++){
ch[++len]='#';
ch[++len]=st[i];
}
ch[++len]='#';
n=len;
}
void manacher(){
modify();
int mx=0,id;
for(int i=2;i<=n;i++){
if(mx>i)len[i]=min(len[id*2-i],mx-i);
else len[i]=1;
while(ch[i+len[i]]==ch[i-len[i]])
len[i]++;
if(len[i]+i>mx){
mx=len[i]+i;
id=i;
}
}
}
int main(){
scanf("%s",st+1);
n=strlen(st+1);
manacher();
ans=1;
for(int i=2;i<=n;i++)
ans=max(ans,len[i]);
printf("%d\n",ans-1);
return 0;
}
作者:skl_win
出处:https://www.cnblogs.com/shaokele/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。