1. 程式人生 > >BZOJ2084 [Poi2010] Antisymmetry題解(manacher)

BZOJ2084 [Poi2010] Antisymmetry題解(manacher)

題目:BZOJ2084.
題目大意:給定一個01串,定義 0 = 1 , 0 0 , 1

1 0=1,0\neq 0,1\neq 1 ,問迴文子串數量.

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; }