洛谷P3805 [模板]Manacher算法 [manacher]
题目描述
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
字符串长度为n
输入输出格式
输入格式:
一行小写英文字符a,b,c...y,z组成的字符串S
输出格式:
一个整数表示答案
输入输出样例
说明
字符串长度len <= 11000000
分析:manacher算法模板,算法分析就不具体讲了,five20大佬讲的挺好的,可以参照一下他的博客。
Code:
#include<bits/stdc++.h> using namespace std; const int N=2e7+3e6+7; char s[N],neo[N];int p[N]; int change() { int len=strlen(s); int ret=0;neo[ret++]='$'; for(int i=0;i<len;i++) neo[ret++]='#',neo[ret++]=s[i]; neo[ret++]='#';neo[++ret]='\0';return ret; } int manacher() { int len=change(); int ans=-N,id,mx=0; for(int i=1;i<=len;i++){ if(i<mx)p[i]=min(p[id*2-i],mx-i); else p[i]=1; while(neo[i-p[i]]==neo[i+p[i]])p[i]++; ans=max(ans,p[i]-1); if(i+p[i]>mx)id=i,mx=i+p[i]; } return ans; } int main() { scanf("%s",s); printf("%d",manacher()); return 0; }
蒟蒻写博客不易,如果有误还请大佬们提出
如需转载,请署名作者并附上原文链接,蒟蒻非常感激
名称:HolseLee
博客地址:www.cnblogs.com/cytus
个人邮箱:1073133650@qq.com
如需转载,请署名作者并附上原文链接,蒟蒻非常感激
名称:HolseLee
博客地址:www.cnblogs.com/cytus
个人邮箱:1073133650@qq.com