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; 
}

  

 

代码:

 

posted @ 2020-06-05 17:46  菜鸡今天学习了吗  阅读(141)  评论(0编辑  收藏  举报