题目大意:
有一字符串,我们定义好的字符串为:它的每一个字符都可以找到那个字符所在的子串的回文串。现在问这个字符串有多少个好的字符串。
解题思路:
首先,我们考虑事件的对立事件。有多少坏的字符串。我们发现一个字符串是坏的,当且仅当出现一个坏的字符在某个串的左右端点。为什么呢?考虑一个字符串,它中间的字符只可能有两种情况。首先:str[i] == str[i-1] || str[i]== str[i+1],那么这个字符串肯定是好的字符串,其次str[i]!=str[i-1] && str[i]!=str[i+1],那么它也可以生成一个回文串例如ABA,BAB。所以出现坏字符串当且仅当出现:
ABBBBB
BBBBBA
BAAAAA
AAAAAB
所以我们找出来即可。
废话:这题首先我们要想到找事件的对立事件。
#include <bits/stdc++.h>
#define OPEN 0
#define int long long
using namespace std;
int32_t main() {
#if OPEN
freopen("in.txt", "r", stdin);
#endif
int n; cin >> n;
string str; cin >> str;
int ans = 0;
for (int ii = 0; ii<2; ii++) {
reverse(str.begin(), str.end());
int i = 0; int j = 0;
while (str[j] == str[i] && j<n) {
j++;
}
for (i = j - 1; i<n; i = j - 1) {
j = i + 1;
if (j == n)break;
while (j<n&&str[j] != str[i]) {
ans++;
j++;
}
if (ii == 1)ans--;
}
}
ans = n*(n - 1) / 2 - ans;
cout << ans << endl;
return 0;
}