hdu 4513

题目

这个考对manancher算法过程的理解,就拿板子改一下,然后在向外扩展的部分增加一些条件,然后就可以过了。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<vector>
#include<cmath>
#include<map> 
#include<string>
#include<queue>
#include<stack> 
#include<bitset>
#include<list>
#include<set>
#define IO ios::sync_with_stdio(false)
//#define int long long
using namespace std;
const int N=100000+5;
int s[N],ns[N*2];
int len,v[30],sum[N],t,pre[N],suf[N],p[N*2],n;
int manacher()
{
	memset(ns,0,sizeof(ns));
	ns[0]=-1;
	ns[1]=0;
	int j=2;
	for(int i=1;i<=n;i++)
	{
		ns[j++]=s[i];
		ns[j++]=0;
	}
	ns[j]=-2;
	int nlen=j;
	int maxlen=-1,id,mx=0;
	for(int i=1;i<=nlen;i++)
	{
		if(i<mx)
		{
			p[i]=min(p[2*id-i],mx-i);
		}
		else
		{
			p[i]=1;
		}
		while(ns[i-p[i]]==ns[i+p[i]]&&ns[i-p[i]]<=ns[i-p[i]+2])p[i]++;//这里是+2的原因是,每个字符都会被#所分割,所以要略过这些字符
		if(mx<i+p[i])
		{
			id=i;
			mx=i+p[i];
		}
		maxlen=max(maxlen,p[i]-1);
	}
	return maxlen;
}
int main()
{
	IO;
	cin>>t;
	while(t--)
	{
		//memset(pre,0,sizeof(pre));
		//memset(suf,0,sizeof(suf));
		cin>>n;
		for(int i=1;i<=n;i++)
		cin>>s[i];
		printf("%d\n",manacher());
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值