BZOJ2084 [Poi2010]Antisymmetry(洛谷P3501)

版权声明:蒟蒻Blog随意转载 https://blog.csdn.net/a1799342217/article/details/82024981

Manacher

BZOJ题目传送门
洛谷题目传送门

注意到如果不取反就是求回文串。那么我们重新定义一下这个“回文串”就是反过来恰好相反的字符串,刷manacher的时候把条件改一下就好了。

代码:

#include<cctype>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 500005
using namespace std;
typedef long long LL;
int n,p[N<<1],r=1,nd=1; LL ans;
char s[N],s1[N<<1];
#define abs(x) ((x)>0?(x):-(x))
int main(){
    scanf("%d%s",&n,s+1),s[0]=s[n+1]='#';
    for (int i=2;i<=n;i++){
        p[i]=i<r?min(p[(nd<<1)-i],r-i+1):0;
        while (abs(s[i+p[i]]-s[i-p[i]-1])==1) p[i]++;
        if (p[i]+i>=r) r=p[i]+i-1,nd=i; ans+=p[i];
    }
    return printf("%lld",ans),0;
}

猜你喜欢

转载自blog.csdn.net/a1799342217/article/details/82024981