题目链接
思路:由于给出的字母只要a和b,所有其实比较容易观察,一眼看回文数量不好求,我们可以转个变,求出不是回文的数量,然后总数减去它就是答案,那么怎么求不是回文的字串数量呢?打个表可以观察一下,一般包含,ABBB,BBBA,BAAA,AAAB的都不是回文串,每次遇到A的时候往前和往后扫相同的B字符数,遇到B的时候也是同理。不过这里有个思维漏洞需要注意一下,就是出现ABAB的时候会减重复了,这个部分要注意一下。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=3e5+1;
char s[maxn];
ll n,ans,cnt;
int main()
{
scanf("%lld",&n);
scanf("%s",s);
for(int i=0;i<n;++i)
{
if(s[i]=='B')
{
for(int j=i-1;j>=0;--j)
if(s[j]=='A') ans++;
else break;
for(int j=i+1;j<n;++j)
if(s[j]=='A') ans++;
else break;
}
if(s[i]=='A')
{
for(int j=i-1;j>=0;--j)
if(s[j]=='B') ans++;
else break;
for(int j=i+1;j<n;++j)
if(s[j]=='B') ans++;
else break;
}
}
for(int i=1;i<n;++i) if(s[i]!=s[i-1]) cnt++;
ans-=cnt;
cout<<n*(n-1)/2-ans<<endl;
}