CSP-M3 补题 T4 咕咕东学英语

一、题目描述
在这里插入图片描述
在这里插入图片描述
二、思路概述

  • 原本想的是一种暴力算法,算出给定的串中的回文串有多少个,再看这些回文串可以拼凑出几个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;
	
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值