HDU3068 最长回文串 解题报告【字符串】【Manacher】
2017-07-29 14:53
363 查看
Problem Description
给出一个只由小写英文字符a,b,c…y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
Input
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c…y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
Output
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
Sample Input
aaaa
abab
Sample Output
4
3
解题报告
很显然这是一道manacher算法的裸题。其算法详解可以看我的这篇博客
代码如下:
给出一个只由小写英文字符a,b,c…y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
Input
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c…y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
Output
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
Sample Input
aaaa
abab
Sample Output
4
3
解题报告
很显然这是一道manacher算法的裸题。其算法详解可以看我的这篇博客
代码如下:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=110000; char s[N+5],s_new[2*N+5]; int p[2*N+5]; int init() { int len=strlen(s),j=1; s_new[0]='$',s_new[1]='#'; for(int i=0;i<=len-1;i++) s_new[++j]=s[i],s_new[++j]='#'; s_new[++j]='\0'; return j; } int manacher() { int len=init(); int id,mx=0; int maxlen=-1; for(int i=1;i<=len-1;i++) { if(i<mx)p[i]=min(p[2*id-i],mx-i); else p[i]=1; while(s_new[i-p[i]]==s_new[i+p[i]])p[i]++; if(mx<i+p[i])mx=i+p[i],id=i; maxlen=max(maxlen,p[i]-1); } return maxlen; } int main() { while(~scanf("%s",s)) { printf("%d\n",manacher()); } return 0; }
相关文章推荐
- 字符串专题小结:Manacher算法求最长回文串
- POJ3974 Palindrome 解题报告【字符串】【Manacher】
- hdu3068 最长回文串 (manacher)
- hdu3068_最长回文串_Manacher(马拉车模板)
- BZOJ2160 拉拉队排练 解题报告【字符串】【Manacher】【差分】
- HDU3068-manacher算法-最长回文串
- 字符串的最长回文串:Manacher’s Algorithm
- 最长回文---hdu3068 (回文串 manacher 算法模板)
- BZOJ3790 神奇项链 解题报告【字符串】【Manacher】【树状数组】【数据结构优化DP】
- Leetcode 409. Longest Palindrome 构造最长回文串 解题报告
- 回文串是指这个字符串无论从左读还是从右读,所读的顺序是一样的;简而言之,回文串是左右对称的。现在,对于一个给定的母串 abcdedcb求最长回文子串的长度
- Manacher算法 O(n)求最长回文串
- 最长回文串 manacher
- 计蒜之道 初赛 第三场 题解 Manacher o(n)求最长公共回文串 线段树
- 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。
- manacher 算法(最长回文串)
- HDU3068 最长回文(manacher)
- POJ 3974 Palindrome【最长回文串(Manacher模板)】
- 腾讯 2017 暑假实习生编程题(一):给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。
- bzoj 2565: 最长双回文串 manacher算法