其他分享
首页 > 其他分享> > Antisymmetry(反对称)

Antisymmetry(反对称)

作者:互联网

Antisymmetry

题目描述

输入格式

输出格式

样例输入

8
11001011

样例输出

7

hint

Solve

void Manacher() {//Manacher板子
    s[0] = '~';//首位插入特殊字符
    for (int i = 1; i <= n; ++i)
        s[i*2-1] = '#', s[i<<1] =a[i];//隔空插入特殊字符,判奇回文串
    s[n*2+1] = '#';
    for (int i = 1, c = 0, r = 0; i <= n << 1; ++i) {
        f[i] = i <= r ? min(f[c*2-i], r - i + 1) : 1;
        while (s[i-f[i]] == s[i+f[i]]) ++f[i];//f[i]*2-1就是以i为中心最长回文子串的长度
        if (i + f[i] - 1 > r) r = i + f[i] - 1, c = i;
    }
}

Code

#include <cstdio>
#include <algorithm>
#define int long long//记得开long long!!
using namespace std;
const int N = 5e5 + 5;
int n, f[N], ans;
char a[N];
signed main() {
    scanf("%lld%s", &n, a + 1);//读入总长及01串
    for (int i = 1, c = 0, r = 0; i < n; ++i) {
    //i是第i个间隔,r是最远右边界,c是其中心的位置
        if (i < r) f[i] = min(f[c*2-i], r - i);
        //进行初始化,不满足i<r的初始值就是0
        while (i - f[i] > 0 && i + f[i] + 1 <= n && a[i-f[i]] != a[i+f[i]+1]) f[i]++;//要判边界
        if (i + f[i] > r) r = i + f[i], c = i;//更新最远右边界及其中心
        ans += f[i];//统计答案
    }
    printf("%lld\n", ans);
    return 0;
}

标签:子串,01,边界,int,long,Antisymmetry,反对
来源: https://www.cnblogs.com/Z8875/p/13401684.html