BZOJ2084 [Poi2010] Antisymmetry題解(manacher)
阿新 • • 發佈:2019-01-13
題目:BZOJ2084.
題目大意:給定一個01串,定義
,問迴文子串數量.
manacher裸題,重新定義一下匹配,然後每個點為對稱中心最長迴文子串長度,求累加和即可.不過注意只有偶數長度的串才會有貢獻.
程式碼如下:
#include<bits/stdc++.h>
using namespace std;
#define Abigail inline void
typedef long long LL;
const int N=500000;
char tmp[N*2+9];
int pal[N*2+9];
LL manacher(char *s,int len){
LL ans=0;
for (int i=1;i<=len;++i)
tmp[i<<1]=s[i],tmp[i<<1|1]='#';
tmp[1]='-';tmp[0]='#';
len=len<<1|1;
int p=0,r=0;
for (int i=1;i<=len;i+=2){
pal[i]=r> i?min(pal[p*2-i],r-i):1;
while (tmp[i+pal[i]]=='#'&&tmp[i-pal[i]]=='#'||(tmp[i+pal[i]]^tmp[i-pal[i]])==1) ++pal[i];
if (i+pal[i]>r) r=i+pal[i],p=i;
}
for (int i=3;i<len;i+=2) ans+=LL(pal[i]>>1);
return ans;
}
char s[N+9];
int n;
Abigail into(){
scanf("%d",&n);
scanf("%s",s+1);
}
Abigail outo(){
printf("%lld\n",manacher(s,n));
}
int main(){
into();
outo();
return 0;
}