hiho1032 : 最长回文子串
2018-02-21 12:42
190 查看
#1032 : 最长回文子串
时间限制:1000ms单点时限:1000ms内存限制:64MB描述
小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进。这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?”
小Ho奇怪的问道:“什么叫做最长回文子串呢?”
小Hi回答道:“一个字符串中连续的一段就是这个字符串的子串,而回文串指的是12421这种从前往后读和从后往前读一模一样的字符串,所以最长回文子串的意思就是这个字符串中最长的身为回文串的子串啦~”
小Ho道:“原来如此!那么我该怎么得到这些字符串呢?我又应该怎么告诉你我所计算出的最长回文子串呢?
小Hi笑着说道:“这个很容易啦,你只需要写一个程序,先从标准输入读取一个整数N[b](N<=30),代表我给你的字符串的个数,然后接下来的就是我要给你的那N个字符串(字符串长度<=10^6)啦。[/b]而你要告诉我你的答案的话,只要将你计算出的最长回文子串的长度按照我给你的顺序依次输出到标准输出就可以了![b]你看这就是一个例子。”[/b]
提示一提示二提示三提示四样例输入
3 abababa aaaabaa acacdas样例输出
7 5 3
#include <bits/stdc++.h>
using namespace std;
typedef long long ll ;
typedef double dl ;
#define INF 0x7f
const int maxn =1e6+5;
#define f(i,l,r) for(int i=l;i<=r;++i)
#define g(i,l,r) for(int i=l;i>=r;--i)
char str[maxn],s[maxn<<1];
int p[maxn<<1];
void manacher()
{
memset(p,0,sizeof(p));
memset(s,0,sizeof(s));
int l=-1;
int n =strlen(str);
f(i,0,n-1)s[++l]='#',s[++l]=str[i];
s[++l]='#';
int mx=-1,id=0;
int ans=0;
f(i,2,l-1)
{
if(mx+id>i)
p[i]=min(p[id*2-i],mx+id-i);
while(i-p[i]-1>=0&&i+p[i]+1<=l &&s[i+p[i]+1]==s[i-p[i]-1])
p[i]++;
if(mx+id<i+p[i])
id=i,mx=p[i];
ans=max(ans,p[i]);
}
cout<<ans<<endl;
}
int main()
{
freopen("in","r",stdin);
int n;
cin>>n;
while(n--)
{
cin>>str;
manacher();
}
return 0;
}
相关文章推荐
- 【hihoCoder】【1032】hiho一下第一周/A:最长回文子串
- Hiho 1032 最长回文子串
- HiHo 1032 最长回文子串 (Manacher算法求解)
- hiho1032 : 最长回文子串 Manacher算法
- HiHo 1032 最长回文子串 (Manacher算法求解)
- hiho 1032 最长回文子串
- (hiho一下第一周)#1032 最长回文子串
- hiho一下第一周#1032 : 最长回文子串
- hihoCoder hiho一下 第一周 #1032 : 最长回文子串 (Manacher)
- hihocoder #1032 : 最长回文子串【 manacher算法实现 】
- HiHo #1032 : 最长回文子串 【Manacher算法】
- hihocoder1032 最长回文子串
- hihocoder 1032 最长回文子串(Manacher算法)
- hihoCoder #1032 : 最长回文子串
- hiho#1032 : 最长回文子串 (manacher算法O(n)时间求字符串的最长回文子串 )
- hihocoder 1032 最长回文子串(Manacher)
- Hihocoder 1032 最长回文子串
- hihocoder #1032 : 最长回文子串 Manacher算法
- [hihoCoder#1032]最长回文子串
- hihoCoder#1032 : 最长回文子串