一、题目描述
二、思路概述
- 原本想的是一种暴力算法,算出给定的串中的回文串有多少个,再看这些回文串可以拼凑出几个delicious的子串,但是好像太暴力,不太对。
- 算出符合要求的串的个数太慢了,但是可以算出不符合要求的串的个数,再由总串数减掉不合要求的。
- 考虑到只有ABBBB…B BBBB…BA BAAAA…A AAAAA…AAB这种字符串不满足条件,也就是子串里有只有一个A或者一个B。
- 先正向遍历串,去掉BBBB…BA || AAAAA…AAB这样的串。
- 再反向遍历串,去掉ABBBB…B||BAAAA…A这样的串。
- 由于AB、BA被去掉了两次,所以再次遍历串,加上它们的个数。
三、完整代码
/*考虑到只有ABBBBBB..B BBBB...BA BAAAA..A AAAAA...AAB这种字符串不满足条件*/
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int main(){
long long n;string s;
cin>>n>>s;
long long nn=n*(n-1)/2;//长为n的串总共有nn个字串
//cout<<nn<<endl;
//从前往后进行遍历,如果碰到一个AB或者BA,就删除不合要求的串
int cnt=1;
for(long long i=1;i<n;i++){
if(s[i]!=s[i-1]){
//cout<<cnt<<endl;
nn=nn-cnt;
cnt=1;
}
else {
cnt++;
}
}
//cout<<nn<<endl;
cnt=1;
for(long long i=n-2;i>=0;i--){
if(s[i]!=s[i+1]){
nn=nn-cnt;
cnt=1;
}
else{
cnt++;
}
}
//cout<<nn<<endl;
for(long long i=1;i<n;i++){
if(s[i]!=s[i-1]){
nn++;
}
}
cout<<nn<<endl;
return 0;
}