码迷,mamicode.com
首页 > 编程语言 > 详细

洛谷P3805 [模板]Manacher算法 [manacher]

时间:2018-04-30 16:38:33      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:bit   好的   include   https   main   amp   scan   传送门   字符串长度   

  题目传送门

  

题目描述

给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.

字符串长度为n

输入输出格式

输入格式:

 

一行小写英文字符a,b,c...y,z组成的字符串S

 

输出格式:

 

一个整数表示答案

 

输入输出样例

输入样例#1:
aaa
输出样例#1:
3

说明

字符串长度len <= 11000000

 


 

 

  分析:manacher算法模板,算法分析就不具体讲了,five20大佬讲的挺好的,可以参照一下他的博客

  Code:

  

 1 //It is made by HolseLee on 30th Apr 2018
 2 //Luogu.org P3805
 3 #include<bits/stdc++.h>
 4 using namespace std;
 5 const int N=2e7+3e6+7;
 6 char s[N],neo[N];int p[N];
 7 int change()
 8 {
 9   int len=strlen(s);
10   int ret=0;neo[ret++]=$;
11   for(int i=0;i<len;i++)
12     neo[ret++]=#,neo[ret++]=s[i];
13   neo[ret++]=#;neo[++ret]=\0;return ret;
14 }
15 int manacher()
16 {
17   int len=change();
18   int ans=-N,id,mx=0;
19   for(int i=1;i<=len;i++){
20     if(i<mx)p[i]=min(p[id*2-i],mx-i);
21     else p[i]=1;
22     while(neo[i-p[i]]==neo[i+p[i]])p[i]++;
23     ans=max(ans,p[i]-1);
24     if(i+p[i]>mx)id=i,mx=i+p[i];
25   }
26   return ans;
27 }
28 int main()
29 {
30   scanf("%s",s);
31   printf("%d",manacher());
32   return 0;
33 }

 

洛谷P3805 [模板]Manacher算法 [manacher]

标签:bit   好的   include   https   main   amp   scan   传送门   字符串长度   

原文地址:https://www.cnblogs.com/cytus/p/8973781.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!