首页 > 其他分享 >P9574 「TAOI-2」Break Through the Barrier

P9574 「TAOI-2」Break Through the Barrier

时间:2023-08-22 19:47:35浏览次数:37  
标签:... ch TAOI int Break Through kkk can2 答案

思路

首先我们可以肯定的是,无论如何变化,答案最多比原序列的连续 \(T\) 的个数多 \(2\)。

理由很简单,对于 \(...BT...TB...\),最好的可能就是前后两个 \(B\) 可以变成 \(T\),因为只可能是 \(BTTB\) 变成 \(TBBT\),所以变了以后再外面就一定是 \(B\) 了,且无法再变。

所以我们可以先找到可能成为答案的一段连续 \(T\),然后暴力向前和向后判断能否增加答案,然后更新答案即可。

那么,什么时候可以增加答案呢?

当然是前面或者后面是 \(BTTB\) 的时候啦,于是我满心欢喜地以为自己找到了正解,然后交了一发,然后 WA 了。

嗯,当时自己确实有点狂妄,都没发现样例最后一组都错了。

再仔细观察了样例后,发现如果出现了 \(BTTBTBTBTB...\) 的情况,就可以从左至右依次变化,最后也能使答案增加。

所以形如前面有至少一个 \(BT\),后面有若干个 \(TB\) 也能增加答案,反过来也同理。

所以我又不假思索地直接写了发暴力判断前后能否增加答案,然后 TLE 了。

嗯,至少没有 WA,这至少是一件好事,代表这个做法没有问题,那么如何优化呢,思考了一下,如果出现了 \(BTTBTBTBTB...\) 的情况,每个 \(T\) 都会去暴力判断一次(因为最长 \(T\) 的长度是 \(2\),那所有长度为 \(1\) 的都有可能加 \(2\) 超过最长的,所以必须判断),那这样的话就重复判断了很多次。如果数据比较特殊,那必然会 TLE。

所以我们需要优化代码,来让上面的情况不会出现。

于是,我想到了预处理。

只要出现了 \(BT\),那么,后面的所有连续的 \(TB\) 的 \(B\) 位置都可以变成 \(T\) 来让答案增加一,反过来也差不多,就跑两边就好。

只是这次我看了下样例,居然错了,形如 \(BTTB\) 的测试点,程序会把左右两个 \(B\) 都搞成可以增加答案的情况了。

所以,我们还需要区分是方向,就用两个数组存就行。

终于,在这一波三折的猪脑过载调试下,终于把这道题目过了。

AC 代码

#include<bits/stdc++.h>
using namespace std;
int T,n,ans,num,p,kkk;
bool can1[100005],can2[100005];
char ch[100005];
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		memset(can1,0,sizeof(can1)),memset(can2,0,sizeof(can2));//记得清零
		scanf("%d%s",&n,ch),p=-1,ans=num=0;//记得赋初始值
		for(int i=0;i<n;++i)
		{
			if(ch[i]=='B'&&ch[i+1]=='T')//如果出现了BT
			{
				int kkk=i+2;
				while(kkk<n-1&&ch[kkk]=='T'&&ch[kkk+1]=='B')
					can1[kkk+1]=1,i=kkk,kkk+=2;//就把所有后面连续的TB的B位置上标记为正向可增加答案
			}
		}
		for(int i=n-1;i>=0;--i)
		{
			if(ch[i]=='B'&&ch[i-1]=='T')//同上,只是顺序反了
			{
				int kkk=i-2;
				while(kkk>0&&ch[kkk]=='T'&&ch[kkk-1]=='B')
					can2[kkk-1]=1,i=kkk,kkk-=2;
			}
		}
		//这里的kkk赋值给i是为了让循环少几次,不然就和直接暴力没什么区别了
		for(int i=0;i<n;++i)
		{
			if(ch[i]=='T')//如果是T就增加,p是为了标记这段连续的T的第一个位置
			{
				++num;
				if(p==-1) p=i;
			}
			else
			{
				/*下面三行可替换为ans=max(ans,num+can1[p-1]+can2[i]);*/ 
				if(can1[p-1]) ++num;
				if(can2[i]) ++num;
				ans=max(ans,num);
				num=0,p=-1; 
			}
		}
		/*下面四行可替换为printf("%d\n",max(ans,num+can1[p-1]+can2[n-1]));*/
		if(can1[p-1]) ++num;
		if(can2[n-1]) ++num;
		ans=max(ans,num);
		printf("%d\n",ans);
		//最后还可能有一段没有判断到,需要再max一遍
	}
	return 0;
}

标签:...,ch,TAOI,int,Break,Through,kkk,can2,答案
From: https://www.cnblogs.com/One-JuRuo/p/17649519.html

相关文章

  • P9575 「TAOI-2」喵了个喵 Ⅳ
    思路考试的时候打死没想出来,一直在想暴力和质因数分解,我实在是太弱了,比赛后看了官方题解才恍然大悟,于是来蹭写篇题解。首先是一些特殊点:当\(n\)是偶数时,显然\(x\)可以取\(1\),这样\(\gcd\)就都是\(1\),然后随便平分就好了。恭喜你,你获得了\(2\)分。当\(n\)不是......
  • P9573 「TAOI-2」核心共振
    思路这道题最开始没发现数列必须是\(1,2,3,\cdots,n\),然后直接交了个输出\(n\)遍\(p\)的代码。我真的好蠢啊后面才发现这一点,于是开始思考,首先从\(p\)比较小的情况。如果\(p\)是\(1\)的话,那显然直接输出\(1,2,3,\cdots,n\)就好了。如果\(p\)是\(2\)的话,显然......
  • 「TAOI-2」Break Through the Barrier 题解
    前言:比赛前去做牙齿矫正,回来晚了10分钟……做比赛的运气全用在了一路绿灯上了(无语)。第二题切了两个半小时。决定写篇题解来抒发一下再记得愤怒愉悦之情。AC的想法很简单,就是表示出每一串连续的\(\texttt{T}\),其长度分别为\(l_1\liml_m\)。明显的,对于任何一个\(l_i\),在一......
  • 论文解读(UDALM)《UDALM: Unsupervised Domain Adaptation through Language Modeling
    Note:[wechat:Y466551|可加勿骚扰,付费咨询]论文信息论文标题:UDALM:UnsupervisedDomainAdaptationthroughLanguageModeling 论文作者:ConstantinosKarouzos,GeorgiosParaskevopoulos,AlexandrosPotamianos论文来源:2021aRxiv论文地址:download论文代码:download视屏......
  • Go语言中的break语句
    在Go语言中,break语句用于立即退出当前控制结构,如for循环、switch或select语句。以下是break语句的使用方法和示例:1.基本用法在此示例中,当遇到值3时,break将中断循环。packagemainimport"fmt"funcmain(){fori:=0;i<5;i++{ifi==3......
  • Practical Covertly Secure MPC for Dishonest Majority – or: Breaking the SPDZ Li
    Abstract.SPDZ(pronounced“Speedz”)isthenicknameoftheMPCprotocolofDamgardetal.fromCrypto2012.˚SPDZprovidedvariousefficiencyinnovationsonboththetheoreticalandpracticalsidescomparedtopreviousworkinthepreprocessingmodel.In......
  • [React Typescript] Generic Inference through Multiple Type Helpers
    import{Equal,Expect}from"../helpers/type-utils";interfaceButton<T>{value:T;label:string;}interfaceButtonGroupProps<T>{buttons:Button<T>[];onClick:(value:T)=>void;}constButtonGroup=<......
  • Nginx中的rewrite指令(break,last,redirect,permanent)
    rewite在server块下,会优先执行rewrite部分,然后才会去匹配location块server中的rewritebreak和last没什么区别,都会去匹配location,所以没必要用last再发起新的请求,可以留空location中的rewirte:不写last和break-那么流程就是依次执行这些rewrite1.rewritebreak-url重写后,直......
  • Vulnhub 靶场 MATRIX-BREAKOUT: 2 MORPHEUS
    前期准备:靶机地址:https://www.vulnhub.com/entry/matrix-breakout-2-morpheus,757/kali攻击机ip:192.168.11.11靶机ip:192.168.11.12一、信息收集及利用1.使用nmap对目标靶机进行扫描发现开放了22、80、81端口。2.80端口访问80端口:查看页面信息没发现什么重要信息,......
  • 『STAOI』G - Round 3
    『STAOI』G-Round3因为在\(STAOI\)团里,所以赛时没打。\(T1\)luoguP9508『STA-R3』存在观察题意,手搓几组样例,易知符合题意的一组解形如\(a,b,b,c,b,b,……,z,(b),(b)\)。不会证明,可以参考下隔壁jijidawang的。时间复杂度\(O(n)\),可以通过本题。#include<bi......