[ABC328D] Take ABC 题解
题目翻译
题目描述
给你一个字符串 \(S\) 包含 A、B 和 C 三个不用的字符。
只要字符串 \(S\) 中包含连续的 ABC 就将 ABC 删除掉
再字符串 \(S\) 不能操作之后输出这个字符串
限制
- \(S\) 的长度小于 \(2 \times 10^5\)
思路1
总结一下这道题目的操作,可以发现就是将字符串删除一部分接着将剩下的部分合并,这不是链表的操作吗。
就直接扫描字符串,如果出现了连续的 ABC 就将其删除。
接着因为删除了这个连续的 ABC 之后,肯能会有新出现的 ABC 连接在一起,所以在最坏的情况下就需要向前回溯两个字符。
但是在回溯的时候需要注意一个细节那就是上一个可能就是第一个了,如果继续回溯就会RE。
#include<bits/stdc++.h>
char a[200005];
int n;
int nex[200005]; //储存第i个元素的下一个元素
int fr[200005]; //储存第i个元素的上一个元素
int head=1; //储存第一个元素
int main(){
scanf("%s",a);
n=strlen(a);
for(register int i=n;i>=1;i--) a[i]=a[i-1];
for(register int i=1;i<=n;i++) nex[i]=i+1;
for(register int i=2;i<=n;i++) fr[i]=i-1;
nex[n+1]=-1; //标记链表结尾
for(register int i=head;nex[i]!=-1&&nex[nex[i]]!=-1&&nex[nex[nex[i]]]!=-1;){
if(a[i]=='A'&&a[nex[i]]=='B'&&a[nex[nex[i]]]=='C'){ //如果满足要求
nex[fr[i]]=nex[nex[nex[i]]]; //删除这三个元素
fr[nex[nex[nex[i]]]]=fr[i];
if(i==head){ //如果上一个就是头
head=nex[nex[nex[i]]];
continue;
}if(fr[i]==head) i=head;
else i=fr[fr[i]];
continue;
}i=nex[i];
}for(register int i=head;nex[i]!=-1;i=nex[i]) putchar(a[i]); //将剩余的输出
return 0;
}
思路2
其实这道题目之所以使用普通数组会超时,是因为在删除后将后面的元素向前转移会划分很多时间。
那么只要后面呢没有元素,就不会存在向前移动导致花费大量时间的问题了。
因为每一次删除操作只会影响前后 \(2\) 个字符,所以可以考虑使用栈进行求解。
每次入一个元素入栈,如果站内的元素个数大于 \(3\) 个,就查看最后 \(3\) 个元素是否是 ABC。
如果是就将其删除,否则继续插入元素。
#include<bits/stdc++.h>
using namespace std;
string s;
char q[200010];
int top;
int main(){
cin>>s;
for(int i=0;i<s.size();i++){ //将元素一次插入栈中
q[++top]=s[i];
if(top>2&&q[top]=='C'&&q[top-1]=='B'&&q[top-2]=='A') top-=3; //一定要判断元素的个数,否则会RE
}for(int i=1;i<=top;i++) cout<<q[i]; //将栈内的元素一次输出
return 0;
}
总结
其实这两种方法的本质都是一样的,只是的具体实现方法不一样。
链表的思维难度没有栈的做法高,但是对码力的要求与效率比栈要高一点。
[ABC328D] Take ABC 题解的更多相关文章
- codeforces CF475 ABC 题解
Bayan 2015 Contest Warm Up http://codeforces.com/contest/475 A - Bayan Bus B - Strongly Connected Ci ...
- Codeforces Round #312 (Div. 2) ABC题解
[比赛链接]click here~~ A. Lala Land and Apple Trees: [题意]: AMR住在拉拉土地. 拉拉土地是一个很漂亮的国家,位于坐标线.拉拉土地是与著名的苹果树越来 ...
- ACM金牌选手讲解LeetCode算法《栈和队列的高级应用》
大家好,我是编程熊,双非逆袭选手,字节跳动.旷视科技前员工,ACM金牌,保研985,<ACM金牌选手讲解LeetCode算法系列>作者. 上一篇文章讲解了<线性表>中的数组.链 ...
- AtCoder ABC 242 题解
AtCoder ABC 242 题解 A T-shirt 排名前 \(A\) 可得 T-shirt 排名 \([A+1,B]\) 中随机选 \(C\) 个得 T-shirt 给出排名 \(X\) ,求 ...
- Codeforces Round #109 (Div. 1) 题解 【ABC】
A - Hometask 题意:给你一个字符串,然后再给你k个禁止挨在一起的字符串,问你最少删除多少个字符串,使得不会有禁忌的字符串对挨在一起.题目保证每个字符最多出现在一个禁忌中. 题解:由于每个字 ...
- AtCoder ABC 215 简要题解
A - B 模拟 C 可以直接爆搜,也可以写逐位确定的多项式复杂度算法,使用多重组合式求随意乱排的方案数. D 首先对 \(A\) 所有数暴力分解质因数,然后把遇到过的质因数打上标记. 接下来再对 \ ...
- [题解] Atcoder Beginner Contest ABC 270 G Ex 题解
点我看题 G - Sequence in mod P 稍微观察一下就会发现,进行x次操作后的结果是\(A^xS+(1+\cdots +A^{x-1})B\).如果没有右边那一坨关于B的东西,那我们要求 ...
- Atcoder Beginner Contest ABC 284 Ex Count Unlabeled Graphs 题解 (Polya定理)
题目链接 弱化版(其实完全一样) u1s1,洛谷上这题的第一个题解写得很不错,可以参考 直接边讲Polya定理边做这题 问题引入:n颗珠子组成的手串,每颗珠子有两种不同的颜色, 如果两个手串能够在旋转 ...
- Codeforces 1323 div2题解ABC
A. Even Subset Sum Problem 签到题 #include <bits/stdc++.h> using namespace std; template <type ...
- CF1494A ABC String 题解
Content 给定 \(T\) 个仅包含大写字母 A,B,C 的字符串 \(s\).问你是否能够通过将每个 A,B,C 换成 (,) 中的一个(同一个字母必须要换成同一个字符),使得最后得到的括号序 ...
随机推荐
- C#程序配置读写例子 - 开源研究系列文章
今天讲讲关于C#的配置文件读写的例子. 对于应用程序的配置文件,以前都是用的ini文件进行读写的,这个与现在的json类似,都是键值对应的,这次介绍的是基于XML的序列化和反序列化的读写例子.对于in ...
- Jmeter关联之正则表达式提取器
正则表达式简介 摘自网上的说法,正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"))操作的一种 逻辑公式,就是用事先定义好的一些特定字符 ...
- Linux 干货整理(持续更新)
博客地址:https://www.cnblogs.com/zylyehuo/ 如果虚拟机开机没有 ip 怎么办 1.vim编辑网卡配置文件,修改如下参数 [root@s25linux tmp]# cd ...
- MySQL数据库触发器讲解 [创建/删除/查询/select into]
刚学习实例完mysql触发器, 前来分享学习经验. 菜鸟装逼, 老鸟勿喷 先来认识一下有关触发器的一些关键词. 在使用触发器时, 这些关键词将被用到, 请记下它们的模样和用途(意思) cre ...
- KRPano多屏互动原理
KRPano可以实现多个屏幕之间的同步显示,主要应用到Websocket技术进行通信. 在控制端,我们需要发送当前KRPano场景的实时的视角和场景信息,可以使用如下的代码: embedpano({ ...
- 【krpano】 ASP说一说插件
简述 这是一个Asp版krpano说一说案例,运用asp+jquery读写存储入xml文件数据库,结合krpano代码实现的功能:现将案例上传网站供大家学习研究,希望对大家有所帮助. 功能 用户可在网 ...
- SpringBoot + Redis + Token 解决接口幂等性问题
前言 SpringBoot实现接口幂等性的方案有很多,其中最常用的一种就是 token + redis 方式来实现. 下面我就通过一个案例代码,帮大家理解这种实现逻辑. 原理 前端获取服务端getTo ...
- Solution -「洛谷 P5046」「YunoOI 2019 模拟赛」Yuno loves sqrt technology I
Description Link. 无修改区间求逆序对. Solution 首先有一个显然的 \(\Theta(N\sqrt{N}\log_{2}N)\) 做法,由于过不了所以我就不废话. 其实有了 ...
- 7.4 通过API枚举进程权限
GetTokenInformation 用于检索进程或线程的令牌(Token)信息.Token是一个数据结构,其包含有关进程或线程的安全上下文,代表当前用户或服务的安全标识符和权限信息.GetToke ...
- 文心一言 VS 讯飞星火 VS chatgpt (100)-- 算法导论9.3 6题
六.用go语言,对一个包含n个元素的集合来说,k分位数是指能把有序集合分成k个等大小集合的第k-1个顺序统计量.给出一个能找出某一集合的k分位数的 O(nlgk)时间的算法. 文心一言: 要找到一个集 ...