HDU 4513 吉哥系列故事——完美队形II

时间:2022-08-01 00:29:08

变形的Manacher算法,在扩展的时候要加入限制条件,满足题目中说的从左到中间身高不减。

其他地方倒是没有什么改动。。

 //#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = + ;
int n;
int a1[maxn], a2[maxn * ], p[maxn * ]; void Init(void)
{
int id, mx = , j = ;
a2[] = -, a2[] = ;
for(int i = ; i < n; ++i)
{
a2[j++] = a1[i];
a2[j++] = ;
}
} void Manacher(int a[])
{
int mx = , id;
p[] = ;
for(int i = ; i < (n+)*; ++i)
{
if(mx > i)
p[i] = min(p[id*-i], mx-i);
else
p[i] = ;
while(a[i+p[i]] == a[i-p[i]])
{
if(a[i-p[i]])
{
if(a[i-p[i]] <= a[i-p[i]+])
++p[i];
else
break;
}
else
++p[i];
}
if(mx < i + p[i])
{
mx = i + p[i];
id = i;
}
}
} void getans(void)
{
int ans = ;
for(int i = ; i < (n+)*; ++i)
ans = max(ans, p[i] - );
printf("%d\n", ans);
} int main(void)
{
#ifdef LOCAL
freopen("4513in.txt", "r", stdin);
#endif int T;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
for(int i = ; i < n; ++i)
scanf("%d", &a1[i]);
Init();
Manacher(a2);
getans();
}
return ;
}

代码君