Week12 CSP-M3 C - Gym 270437N
题目描述:

思路:
考虑一个字符,两种情况,A,B,
考虑两个字符,四种情况,AA,AB,BA,BB(其中AA,BB,满足要求)
考虑三个字符,八种情况,AAA,AAB,ABA,ABB,BAA,BAB,BBA,BBB(其中只有AAB和BBA 不满足情况)
考虑四个字符,还有必要考虑吗?没有了,因为任何形式的串,其子串除了BA,BBA,BBBA,AB,ABB,ABBB不满足情况,其他子串都能分割成两个长度为2或3的回文串
考虑五个字符,除了BA,BBA,BBBA,BBBBA,AB,AAB,AAAB,AAAAB之外,其他子串都能分割成两个长度为2或3或4的回文串
所以只有ABBBB和BAAAA这种子串不满足要求,其他都满足要求
代码:
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
typedef long long ll;
ll N,ans;
int main()
{
cin>>N;
string s;
cin>>s;
int lastPos=0,abOrba=0;
ans=(N-1)*N/2;
for(int i=1;i<N;i++)
{
if(s[i]!=s[i-1])
{
ans=ans-(i-lastPos); //BAAAAAAB,i=7,LastPos=1,AB,AAB,AAAB,AAAAB,AAAAAB,AAAAAAB,正好6个
lastPos=i;
abOrba++;
}
}
lastPos=N-1;
for(int i=N-2;i>=0;i--)
{
if(s[i]!=s[i+1]) //ABBBBBBA,i=1,lastPos=7
{
ans=ans-(lastPos-i);
lastPos=i;
}
}
ans+=abOrba;
cout<<ans<<endl;
return 0;
}

浙公网安备 33010602011771号