题目翻译

题目描述

给你一个字符串 \(S\) 包含 ABC 三个不用的字符。

只要字符串 \(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 题解的更多相关文章

  1. codeforces CF475 ABC 题解

    Bayan 2015 Contest Warm Up http://codeforces.com/contest/475 A - Bayan Bus B - Strongly Connected Ci ...

  2. Codeforces Round #312 (Div. 2) ABC题解

    [比赛链接]click here~~ A. Lala Land and Apple Trees: [题意]: AMR住在拉拉土地. 拉拉土地是一个很漂亮的国家,位于坐标线.拉拉土地是与著名的苹果树越来 ...

  3. ACM金牌选手讲解LeetCode算法《栈和队列的高级应用》

    大家好,我是编程熊,双非逆袭选手,字节跳动.旷视科技前员工,ACM金牌,保研985,<ACM金牌选手讲解LeetCode算法系列>作者. 上一篇文章讲解了<线性表>中的数组.链 ...

  4. AtCoder ABC 242 题解

    AtCoder ABC 242 题解 A T-shirt 排名前 \(A\) 可得 T-shirt 排名 \([A+1,B]\) 中随机选 \(C\) 个得 T-shirt 给出排名 \(X\) ,求 ...

  5. Codeforces Round #109 (Div. 1) 题解 【ABC】

    A - Hometask 题意:给你一个字符串,然后再给你k个禁止挨在一起的字符串,问你最少删除多少个字符串,使得不会有禁忌的字符串对挨在一起.题目保证每个字符最多出现在一个禁忌中. 题解:由于每个字 ...

  6. AtCoder ABC 215 简要题解

    A - B 模拟 C 可以直接爆搜,也可以写逐位确定的多项式复杂度算法,使用多重组合式求随意乱排的方案数. D 首先对 \(A\) 所有数暴力分解质因数,然后把遇到过的质因数打上标记. 接下来再对 \ ...

  7. [题解] Atcoder Beginner Contest ABC 270 G Ex 题解

    点我看题 G - Sequence in mod P 稍微观察一下就会发现,进行x次操作后的结果是\(A^xS+(1+\cdots +A^{x-1})B\).如果没有右边那一坨关于B的东西,那我们要求 ...

  8. Atcoder Beginner Contest ABC 284 Ex Count Unlabeled Graphs 题解 (Polya定理)

    题目链接 弱化版(其实完全一样) u1s1,洛谷上这题的第一个题解写得很不错,可以参考 直接边讲Polya定理边做这题 问题引入:n颗珠子组成的手串,每颗珠子有两种不同的颜色, 如果两个手串能够在旋转 ...

  9. Codeforces 1323 div2题解ABC

    A. Even Subset Sum Problem 签到题 #include <bits/stdc++.h> using namespace std; template <type ...

  10. CF1494A ABC String 题解

    Content 给定 \(T\) 个仅包含大写字母 A,B,C 的字符串 \(s\).问你是否能够通过将每个 A,B,C 换成 (,) 中的一个(同一个字母必须要换成同一个字符),使得最后得到的括号序 ...

随机推荐

  1. 记录一次AutoMapper注册报错

    通常,.Net5我们注册服务是这样的. //添加AutoMapper var automapperConfog = new MapperConfiguration(config => { con ...

  2. c# 如何将程序加密隐藏?

    下面将介绍如何通过LiteDB将自己的程序进行加密,首先介绍一下LiteDB. LiteDB LiteDB是一个轻量级的嵌入式数据库,它是用C#编写的,适用于.NET平台.它的设计目标是提供一个简单易 ...

  3. 微服务集成redis并通过redis实现排行榜的功能

    默认你已经看过我之前的教程了,并且拥有上个教程完成的项目, 之前的教程 https://www.cnblogs.com/leafstar/p/17638933.html 由于redis的安装网上教程很 ...

  4. U268603 I Hate This Tree 题解

    传送门 一道纯粹的码力 + 卡常题. 前置 矩阵乘法,线段树. 分析 线段树存矩阵. 构造迭代矩阵: \[\begin{pmatrix}f_i&f_{i-1}\end{pmatrix}\tim ...

  5. Visual Studio Code(vscode)下载慢 插件安装失败解决方案

    目录 一.系统环境 二.前言 三.Visual Studio Code(vscode)简介 四.解决Visual Studio Code(vscode)下载慢的问题 4.1 问题描述 4.2 解决方案 ...

  6. Maven关联本地已有仓库的方法

    1. 将本地仓库目录localwarehouse进行压缩为localwarehouse.rar. 2. 将localwarehouse.rar解压到D:\maven文件夹中,然后在setting.xm ...

  7. Webpack性能优化 SplitChunksPlugin的使用详解

    使用前景 在vue.react等使用webpack为项目打包工具的前端项目,在开发过程中,随着项目功能的逐渐增加,项目整体体积的不断增加,打包的时长和打包后部署的项目体积也在不停的增长,这样可能会导致 ...

  8. Springboot中使用线程池的三种方式

    前言 多线程是每个程序员的噩梦,用得好可以提升效率很爽,用得不好就是埋汰的火葬场. 这里不深入介绍,主要是讲解一些标准用法,熟读唐诗三百首,不会作诗也会吟. 这里就介绍一下springboot中的多线 ...

  9. Blazor Server 发起HttpPost请求,但是多参数

    一.介绍 今天突然想起之前工作上遇到的一个问题,在做Blazor 开发时后端给的一个接口请求方式是Post ,但是他需要携带多个参数,新建一个公共类又觉得麻烦,我就尝试着怎么在Post请求中携带多个参 ...

  10. math 库中常用的数学运算和常量【GO 基础】

    〇.关于 math GO 语言的 math 库是一个内置的标准库,其中包含了许多数学函数和常量,用于计算各种数学运算和统计学计算. 日常开发中,计算当然是少不了的,那么今天来梳理下备查. 一.测试示例 ...