[CF1238D] AB-string

[CF1238D] AB-string - 结论,dp

Description

如果一个字符串的每个字母,属于至少一个(长度大于1)的回文串,则称这个字符串为good。问给定 01 串有多少个子串是 good。

Solution

bad 的子串只有下面 4 种形式

ABBB...BB

BAAA...AA

AA...AAAB

BB...BBBA

所以我们先 dp 计算出一个位置向左、向右能延伸出多少个相同的,然后扫一遍统计即可

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 1e6 + 5;

int n;
string str;
int l[N], r[N], ans;

signed main()
{
    ios::sync_with_stdio(false);

    cin >> n >> str;

    str = "0" + str + "0";

    char a = 'a';
    char b = 'b';

    for (int i = 1; i <= n; i++)
    {
        if (str[i] == str[i - 1])
            l[i] = l[i - 1] + 1;
        else
            l[i] = 1;
    }
    for (int i = n; i >= 1; i--)
    {
        if (str[i] == str[i + 1])
            r[i] = r[i + 1] + 1;
        else
            r[i] = 1;
    }

    for (int i = 1; i < n; i++)
    {
        if (str[i] != str[i + 1])
        {
            ans += l[i] + r[i + 1] - 1;
        }
    }

    cout << n * (n - 1) / 2 - ans << endl;
}
原文地址:https://www.cnblogs.com/mollnn/p/14476780.html