[CF451D] Count Good Substrings

[CF451D] Count Good Substrings

Description

一个字符串是“好的”,当且仅当合并其中的相同连续区间后,它是一个回文串。给你一个字符串,只有 a,b 两种字符,现在要你分别求出长度为奇数和偶数的“好的”子串数量。

Solution

由于只有两种字符,一个串是好的,当且仅当它开头结尾字符相同

问题转化为,求开头结尾字符相同的,长度为奇数或者偶数的串的数量

也就是,求相同字符,间距为奇数或偶数的点对的数量

#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
    ios::sync_with_stdio(false);
    string s;
    cin >> s;
    int n = s.length();
    int c[2][2] = {{0, 0}, {0, 0}};
    for (int i = 0; i < n; i++)
        c[i & 1][s[i] & 1]++;
    int even = (c[0][0] * c[1][0] + c[0][1] * c[1][1]);
    int odd = c[0][0] * (c[0][0] + 1) / 2 + c[1][1] * (c[1][1] + 1) / 2 +
              c[0][1] * (c[0][1] + 1) / 2 + c[1][0] * (c[1][0] + 1) / 2;
    cout << even << " " << odd;
}