描述

小Hi最近在玩一个字符消除游戏。给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的:

1)如果s包含长度超过1的由相同字母组成的子串,那么这些子串会被同时消除,余下的子串拼成新的字符串。例如"ABCCBCCCAA"中"CC","CCC"和"AA"会被同时消除,余下"AB"和"B"拼成新的字符串"ABB"。

2)上述消除会反复一轮一轮进行,直到新的字符串不包含相邻的相同字符为止。例如”ABCCBCCCAA”经过一轮消除得到"ABB",再经过一轮消除得到"A"

游戏中的每一关小Hi都会面对一个字符串s。在消除开始前小Hi有机会在s中任意位置(第一个字符之前、最后一个字符之后以及相邻两个字符之间)插入任意一个字符('A','B'或者'C'),得到字符串t。t经过一系列消除后,小Hi的得分是消除掉的字符的总数。

请帮助小Hi计算要如何插入字符,才能获得最高得分。

输入

输入第一行是一个整数T(1<=T<=100),代表测试数据的数量。

之后T行每行一个由'A''B''C'组成的字符串s,长度不超过100。

输出

对于每一行输入的字符串,输出小Hi最高能得到的分数。

提示

第一组数据:在"ABCBCCCAA"的第2个字符后插入'C'得到"ABCCBCCCAA",消除后得到"A",总共消除9个字符(包括插入的'C')。

第二组数据:"AAA"插入'A'得到"AAAA",消除后得到"",总共消除4个字符。

第三组数据:无论是插入字符后得到"AABC","ABBC"还是"ABCC"都最多消除2个字符。

样例输入

3
ABCBCCCAA
AAA
ABC

样例输出

9
4
2

解题思路

暴力法:在每个位置尝试插入A,B,C字符,计算当前字符串的得分,并记录最大得分。

AC代码

#include <iostream>
#include <string>using namespace std;//得到字符串str的得分
int getScore(string str) {//cout << str << endl;int score = 0;size_t oldlen = str.size(); //记录原始字符串的长度string new_str;//当原始字符串与新字符串长度相同时,表示没有可删除的字符,结束循环while (oldlen != new_str.size()) {oldlen = str.size();new_str.erase(0, new_str.size());size_t i = 0;//删除重复的字符串,并更新得分,将未重复的字符加入new_strwhile (i < str.size()) {if (str[i] == str[i+1]) {while (i < str.size() && str[i] == str[i+1]) {++score;++i;}++score;++i;} elsenew_str += str[i++];}//cout << new_str << endl;str = new_str;}return score;
}//得到字符串在添加一个字母后的最大得分
int getMaxScore(string &str) {char selectedSet[] = {'A', 'B', 'C'};int maxscore = 0;//在每个位置尝试插入A, B, Cfor (size_t i = 0; i < str.size(); ++i) {for (int j = 0; j < 3; ++j) {str.insert(i+1, 1, selectedSet[j]);int score = getScore(str);maxscore = max(score, maxscore);str.erase(i+1, 1);}}return maxscore;
}int main()
{int Totalnum;cin >> Totalnum;for (int i = 0; i < Totalnum; ++i) {string str;cin >> str;cout << getMaxScore(str) << endl;}return 0;
}

雷区

误区1:审题不清!!!

相邻字符消除,马上想到栈,将字符串从前到后依次入栈,每次加入新的字符时,判断当前字符与栈顶元素是否相同,如果相同,判断当前字符与其相邻的后面的字符是否相同,更新得分,弹栈,当遍历完整个字符串时,即可得到结果。

该题是先将当前字符串中相邻的相同字符删除,不断得到新的字符,不断重复删除步骤直至不能继续删除。

ABCCBCCCAA ,删除CC,CCC,AA,得到 ABB,删除BB,得到A   得分为9

如果每个元素依次入栈则为

ABCC,删除CC,得ABB,删除BB,得ACCC,删除CCC,得AAA,删除AAA,最后得到空字符串,得分为10

本题也可以用栈,但是需要所有的字符先入栈,然后不断弹出栈顶,将相同的相邻字符删除,其他字符压入新的栈,重复该过程,直至存放字符串的栈的大小不再改变。如果这样的话,不如直接用两个字符串,不断遍历字符串,将未删除的字符保存在new_str中,如果删除前和删除后字符串长度未发生改变,表示无法再删除,返回得分。

误区2:想当然,耍小聪明!!!

自以为只要在字符串中,相邻字符不同的位置插入前一个字符即可,保证每次的插入都要消除一个原字符串中不能消除的值,同时减少插入的次数。

实际上插入的字符有时候并不是在第一次删除过程中就起作用,在第二次或之后的删除中才能发挥更大的作用。

只在相邻字母不同的位置插入字符,结果为WA

如果换成在所有可能插入的位置尝试插入A, B, C时,AC

总结

不要耍小聪明,先理解清楚题意,考虑所有可能情况,不要想当然。通过之后再想办法优化。

hihoCoder--1039:字符消除相关推荐

  1. hihoCoder 1039:字符消除(字符串处理)

    #1039 : 字符消除 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消 ...

  2. 1039 字符消除 java_Hihocoder 1039 字符消除

    描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的: 1)如果s包含长度超过1的由相同字母组成的子串,那么这些子串会被同时消除, ...

  3. 【hihocoder 1039 字符串消除】模拟

    题目链接:http://hihocoder.com/problemset/problem/1039 题意:给定一个只由{A, B, C}组成的字符串s,长度为n, 故包含n+1个空隙:现要求在某个空隙 ...

  4. hihoCoder #1902 字符替换

    解法 这题比赛时过的人很多,我却没思路,糊里糊涂写了个强联通分量,得了 80 分. 这题思路是这样的. 一个替换操作可以看做一个有向边,所以题目实际上给出了一个有向图 $G$,一个节点代表一个字母. ...

  5. afe 高通_高通ASOC中的machine驱动

    ASoC被分为Machine.Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的代码,再次引用上一节的内容:Machin ...

  6. 2016/11/27月赛总结

    比赛链接:点这里  密码:ACM7114 题目: C - The calculation of GPA Time Limit:1000MS     Memory Limit:32768KB     6 ...

  7. 第二次月赛总结(11.27)

    C -The calculation of GPA Description 每学期的期末,大家都会忙于计算自己的平均成绩,这个成绩对于评奖学金是直接有关的.国外大学都是计算GPA(grade poin ...

  8. vb中mschart利用数组作图_选考VB算法解析之2019年4月高考真题卷第17题

    说在前面 在对数组排序时,我们常把数组分成已排序区域和待排序区域,并使用左右边界来划分待排序区域的范围:对分查找时我们也引入了左右边界的概念.可见左右边界在数组中是一个非常重要的概念,它在分段处理数组 ...

  9. CodeForces:1103(div1)1104(div2)

    文章目录 前言 CF1104A Splitting into digits Description\text{Description}Description Solution\text{Solutio ...

最新文章

  1. 千万别中招!手把手教你复现Log4j2漏洞!
  2. android 一维数组遍历,$.each()循环遍历一维数组、二维数组、JSON数据和DOM元素
  3. C#的多线程机制探索4
  4. 关于Kanas.Net框架的一些背景
  5. OpenCV中图像显示窗口函数namedWindow()详解
  6. sql自动生成工具_可自动生成代码,5款基于AI的开发工具
  7. 2017苏州太湖国际马拉松 半程成绩单
  8. 小心了!这18位数字一泄漏,支付宝账户就可能会被他人盗刷!
  9. nginx ngx_http_core_module(http server location)
  10. 使用SQL Server数据库指标预测应用程序问题
  11. 程序员别埋头苦干了,花时间学点薪资谈判技巧多赚一个亿可好?
  12. Timeline Storyteller 现已加入自定义图表库
  13. 目标检测之2015iccv---objdetection 专题论文
  14. python运维开发实战
  15. ssm小型超市管理系统的设计与实现毕业设计源码011136
  16. 英国高中A-Level和IB课程介绍
  17. 方差、标准差、协方差概念与意义梳理
  18. ERROR security.UserGroupInformation: Priviledge...
  19. 谷歌 Jason Wei | AI 研究的 4 项基本技能
  20. 搜狗搜索立知问答合作说明

热门文章

  1. 高斯噪音 matlab,如何给图像添加高斯噪声(MATLAB)
  2. 学会人际关系是网站主编的先决条件
  3. js将秒转化为小时和分钟的形式
  4. 100刮板机筒 斜带式输送机 移动式皮带机 凸轮机构设计 1.6m煤矿单滚筒提升机图纸 90°转弯输送机 皮带机伸缩装置图纸 螺杆输送机图 铝锭铸造机整体图 / 设计
  5. 机器学习之多模型融合预测iris数据集
  6. 百度前端技术学院:第二十八天到第三十天 给爱的人发个邮件吧
  7. 半路出家windbg(先搞清楚自己分析出来的参数都是什么意思)
  8. php 序列化 反序列化 __sleep __wakeup
  9. 江苏二本计算机科学与技术好的学校排名,江苏最好的二本学校,2021年江苏二本学校排名前十名单公布...
  10. kettle插入/更新的使用