*
个人思路:
- 因为要求的是满足条件的子串的个数,无非就是两种算法:
a.通过某种约束,直接求出满足条件的子串;
b.所有子串减去不满足条件的子串。 - 显然,第二种方法更加简单,因为要判断一个字符是Delicious要远比判断其
不是困难。 - 因为字符串中只有A、B两种字符,所以在判断时,只需要判断一端的两个字符是否是相反的,如果不同那么说明包括这两个字符的子串均不符合要求,从总数中减去。
- 正反向两次遍历,得到最后的结果。
代码块:
#include <iostream>
using namespace std;
long long total = 0, n;
string s;
int main(){
ios::sync_with_stdio(false);
cin >> n;
cin >> s;
total = (n*(n-1))/2; //因为要求子串长度大于1
int sig = 0;
for(int i = 0; i < n-1; ++i){
if(s[i+1] != s[i]){
total -= (i+1 - sig);
sig = i+1;
}
}
sig = n-1;
for(int i = n-1; i >= 1; --i){
if(s[i] != s[i-1]){
total -= (sig - (i-1) - 1);
sig = i-1;
}
}
cout << total << endl;
return 0;
}