当前位置: 移动技术网 > 移动技术>移动开发>IOS > hdu 4513

hdu 4513

2020年08月10日  | 移动技术网移动技术  | 我要评论

这个考对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());
	}
}

本文地址:https://blog.csdn.net/qq_37073764/article/details/107881050

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网