Bzoj2084

浅浅地改一下 manacher 就好了。

注意只有长度为偶数的字串才可以被统计。

code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<bits/stdc++.h>
#define maxn 1000005
#define ll long long
#define put() putchar('\n')
using namespace std;
inline void read(int &x){
int f=1;x=0;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
x*=f;
}
int n;
int a[maxn],d[maxn];
inline void manacher(int n){
int i,mx,mid;
for (i=1;i<=n;i+=2) d[i]=1;
for (mx=mid=0,i=1;i<=n;i++) {
if (i<=mx) d[i]=min(d[mid*2-i],mx-i+1);
while (a[i-d[i]]+a[i+d[i]]==1||(a[i-d[i]]==2&&a[i+d[i]]==2)) d[i]++;
if (mx<i+d[i]) mx=i+d[i]-1,mid=i;
}
}
signed main(void){
freopen("1.in","r",stdin);
int i,m;ll ans=0;char ch;
read(n);a[0]=-1e8;a[++m]=2;cin>>ch;
for (i=1;i<=n;i++) a[++m]=ch-'0',ch=getchar(),a[++m]=2;a[++m]=1e9;
manacher(m);
// for (i=1;i<=m;i++) printf("%d ",a[i]);
for (i=1;i<=m;i++) if (i%2==1) ans+=(d[i]-1)/2;
printf("%lld",ans);
return 0;
}