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