1
题目链接
马拉车算法+差分
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+10;
int a[N],b[N];
int p[N],c[N],n;
void insert(int x,int y,int z)
{
c[x]+=z;
c[y+1]-=z;
}
int manacher(int l)
{
int r=0,mid=0,ans=0;
for(int i=1;i<=l;i++)
{
p[i]=1;
if(i<r) p[i]=min(p[2*mid-i],r-i);
while(b[i+p[i]]==b[i-p[i]]) p[i]++;
insert(i-p[i]+1,i,1);
if(i+p[i]>r) r=i+p[i],mid=i;
ans=max(ans,p[i]-1);
}
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int sum=0;
for(int i=1;i<=n;i++) b[++sum]=0,b[++sum]=a[i];
b[1]=-1,b[sum+1]=-2;
int ans=manacher(sum);
//printf("ans=%d\n",ans);
for(int i=1;i<=sum;i++) c[i]+=c[i-1];
for(int i=1;i<=sum;i++)
{
if(i%2==0) printf("%d ",c[i]);
}
}