zzulioj1861(最长回文子串)

1861: 斗破苍穹

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 246   Solved: 64

Submit Status Web Board

Description

有一天, 我们帅气的LC来到加玛帝国. 有时候, 缘分就是这么奇怪, LC和加玛帝国的公主一见钟情, 奈何公主的父王不同意, 因为他觉得LC除了长得特别帅之外, 并没有一技之长.

LC对此呵呵一笑, 他说, 我可是创新实验室走出来的学生, 我会的技能可多着呢, 先说个简单的吧, 只要你给我任意一串字符串, 我就能立马算出这串字符串当中最长回文串的长度. 国王很是吃惊, 说要考一考LC.

于是国王想让你帮忙写一个程序, 用来比对LC的答案, 快来帮帮国王吧!

Input

第一行输入一个T(T <= 50), 表示一共有T组测试数据. 接下来T行, 每行为一组由小写字母组成, 长度不超过10^5的字符串.

Output

每行一个整数X, 表示该组字符串中所包含的最长回文长度.

Sample Input

3abaabcaabaa

Sample Output

315

HINT

Source

//zzulioj1861(回文串)
//题目大意:给你一列字符串,求出这列串中最长的回文子串.
//解题思路:Manacher算法求最长回文串. 
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; 
char s[100010],str[10000010];
int p[10000010];
int Manacher(int len)
{
	int mx=0,id=0,i,maxl=0;
	for(i=1;i<len;i++)
	{
		if(mx>i)
		{
			p[i]=min(p[2*id-i],mx-i);
		}
		else
		{
			p[i]=1;
		}
		while(str[i-p[i]]==str[i+p[i]])
		 p[i]++;
		if(i+p[i]>mx)
		{
			mx=i+p[i];
			id=i;
		}
	}
	for(i=1;i<len;i++)
	{
		if(maxl<p[i]) maxl=p[i];
	}
	return maxl;
}
int main()
{
	int i,j,k,len,t;
	scanf("%d",&t);
	getchar();
	while(t--)
	{
		scanf("%s",s);
		k=strlen(s);
		str[0]='@';
	    for(i=0,j=1;i<k;i++)
	    {
		  str[j]='#';
		  j++;
		  str[j]=s[i];
		  j++;
	    }
	    str[j]='#';
	    len=2*k+1;
	    int result=Manacher(len);
	    printf("%d\n",result-1);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bokzmm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值