欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

hdu 4513

程序员文章站 2022-06-19 13:04:24
题目这个考对manancher算法过程的理解,就拿板子改一下,然后在向外扩展的部分增加一些条件,然后就可以过了。#include#include#include#include#include#include#include #include#include<...

题目

这个考对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

相关标签: 字符串 manacher