[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;
}