bzoj2084 [Poi2010]Antisymmetry

来源:互联网 发布:诺思星被淘宝大学开除 编辑:程序博客网 时间:2024/05/21 10:55

反对称子串,emmm,其实本质上和回文子串是一样的,只是对应方法不一样罢了。然后就可以直接上 马拉车(manacher)了。

#include<bits/stdc++.h>#define N 1000000using namespace std;char s[N+5],tmp[2*N+5];int p[2*N+5];int n,m;long long ans;inline void manacher(){    m=2*n+1;    for (int i=1;i<=n;i++)tmp[i*2]=s[i],tmp[i*2+1]='#';    tmp[0]='+';tmp[1]='#';tmp[m+1]='-';    int mx=0,id=0;    for (int i=1;i<=m;i+=2)    {        if (mx>i) p[i]=min(p[2*id-i],mx-i);else p[i]=1;        while (tmp[i+p[i]]-'0'+tmp[i-p[i]]-'0'==1 || (tmp[i+p[i]]==tmp[i-p[i]] && tmp[i+p[i]]=='#')) p[i]++;        if (i+p[i]>mx) mx=i+p[i],id=i;    }}int main(){    freopen("in.txt","r",stdin);    scanf("%d\n",&n);    scanf("%s",s+1);    manacher();    for (int i=1;i<=m;i+=2) ans+=(p[i]-1)/2;    printf("%lld\n",ans);    return 0;}

值得说的是,要把字符串处理一下,头尾各加一个不同字符,中间插一样的特殊字符(处理偶数)。

原创粉丝点击