思路:
先来简单说一下题意,
给定字符串内有多少回文子串,且两个及以上回文子串组合也可以算一个回文子串。
思路:寻找所有回文子串,然后任意个数组合…可能会超时,
反向,找到不是回文子串以及不是回文子串的组合,用总的子串个数减一下;
首先,ab,ba
不是回文子串
由ab,ba
衍生出ab...b,a...ab,b...ba,ba...a
也不是回文子串或者回文子串组合而成。
我们只需要找到满足上述条件的子串即可;
代码:
#include <algorithm>
#include <cstdio>
using namespace std;
const int maxn=3e5+5;
char a[maxn];
int n,cnt;
int main()
{
scanf("%d ",&n);
for(int i=1; i<=n; i++)
{
scanf("%c",&a[i]);
}
long long sum=1ll*n*(n-1)/2; //总子串个数
long long ans=0;
long long cnta=0,cntb=0; //满足条件子串的个数统计
int prea=0,preb=0; //标记 前面是不是有a或者b
for(int i=1; i<=n; i++)
{
if(a[i]=='A')
{
cnta++;
prea=1;
if(cnta==1&&preb) ans+=cntb;
if(cnta>1&&preb) ans++;
cntb=0;
}
else
{
cntb++;
preb=1;
if(cntb==1&&prea) ans += cnta;
if(cntb>1&&prea) ans++;
cnta=0;
}
}
printf("%lld",sum-ans);
return 0;
}