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