洛谷链接&Atcoder 链接

本篇题解为此题较简单做法较少码量,并且码风优良,请放心阅读。

题目简述

现在有一个字符串 \(S\),每一次你可以选择一个 \(i(1 \le i \le | S |)\),如果 \(S_i = S_{i + 1} \ne S_{i + 2}\)。就可以将 \(S_{i + 2}\) 设为 \(S_i\)

最多能操作几次。

思路

本题比较贪心,让我们先来造一个样例解释一下:

abbfioidddssabsaa 最优的方案是:

  • 先操作 \(4\) 次变为 abbfioidddsssssss

  • 再操作 \(7\) 次变为 abbfioidddddddddd

  • 最后操作 \(14\) 次变为 abbbbbbbbbbbbbbbb

这样最大总操作次数为 \(25\) 次。

从这个样例中可以发现贪心思路,要想总操作次数最大化,就需要从后到前去操作,如果从前到后操作那么后面可操作的连续字母就会被覆盖,这样总操作次数就不是最大了。

对于每次操作,最优的是把后面的所有不相同的字母变为一样,这就涉及到一个问题,如果后面有相同字母如何判断?其实不必再从当前位置往后搜,只需要定义一个 \(num\) 一维数组用 \(num_i\) 表示当前位置的后面字母 \(i\) 的个数

对于 \(num\) 数组需要在搜的过程中处理。如果遇到可以替换的情况就把当前位置后的字母全变为当前字母,同时需清空 \(num\) 数组的记录,把当前位置的字母数记录即可。

替换后,\(ans\) 需增加 \(n - i\),考虑到后面的相同字母,所以就需要用到我们维护的 \(num\) 数组了,所以操作数需减去 \(num_{str_{i}-'a'}\)。

经过以上分析及优化后,很容易即可写出代码了:

#include<iostream>
using namespace std; string str;
long long ans = 0, num[205]; int main() {
cin >> str;
int n = str.length(); // 记录 str 的长度
num[str[n - 1] - 'a'] ++, num[str[n - 2] - 'a'] ++; // 初始化 num 数组
for(int i = n - 3; i >= 0; i --) {
num[str[i] - 'a'] ++; // 记录此位置的字母
// 满足替换的条件
if(str[i + 1] != str[i + 2] && str[i] == str[i + 1]) {
ans += n - i - num[str[i] - 'a'];
for(int j = 0; j < 26; j ++) num[j] = 0; // 清空 num 数组
num[str[i] - 'a'] = n - i; // 记录替换后的字母数
}
}
cout << ans << endl; // 输出,换行好习惯
return 0;
}

提交记录

\[\text{The End!}
\]

AT_arc113_c 题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

  10. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

随机推荐

  1. 5款超好用的AI换脸软件,一键视频直播换脸(附下载链接)

    随着AIGC的火爆,AI换脸技术也被广泛应用于娱乐.广告.电影制作等领域,本期文章系统介绍了市面上超火的5款AI软件 换脸整合包收录了全部5款AI工具,请按照需要选择下载: 百度网盘:https:// ...

  2. 一文看懂Spring事务的七种传播行为

    什么叫事务传播行为?听起来挺高端的,其实很简单. 即然是传播,那么至少有两个东西,才可以发生传播.单体不存在传播这个行为. 事务传播行为(propagation behavior)指的就是当一个事务方 ...

  3. linux开机出现initramfs无法进入系统

    linux开机出现initramfs无法进入系统 开机后进入initramfs模式,无法进入系统时不要慌: 想一想自己根分区的文件系统名是什么,有的人的是/dev/sda1,有的人的是/dev/sda ...

  4. 微信iOS消息拦截插件教程-手机越狱环境搭建

    微信iOS消息拦截插件教程-手机越狱环境搭建 标签(空格分隔): ios越狱开发 环境 背景介绍 本教程所有内容免费 本教程来源于一次知识分享,如果有需要了解更多的 请联系QQ:480071411 i ...

  5. BGP中next-hop-self 小实验

    next-hop-self 在EBGP和IBGP边界使用,对ibgp下一跳邻居使用 配置命令 router bgp 1234 neighbor 2.2.2.2 next-hop-self 使用Next ...

  6. asp.net上传Excel文件并读取内容,自定义上传控件样式

    一.页面增加上传控件,并在上传时判断是否是Excel文件(根据后缀名判断): 1 <table> 2 <tr> 3 <td> 4 <span style=&q ...

  7. kali更换apt镜像

    kali更换apt镜像 vim /etc/apt/sources.list 进来之后按i进入编辑模式,把其他的镜像#注释掉之后,加上新的镜像,然后esc退出编辑,按:输入wq保存并退出! 上面的办法不 ...

  8. linux日志查询less及堡垒机查询日志方法

    方法1tail -f orderFile.log | grep "关键字" postman接口请求的时候,关注控制台对关键字过滤的打印输出. 方法2less 文件名称/ 关键字n ...

  9. 这个vue3的后台管理系统虽然简洁但不简单

    今天介绍一个新的Vue后台管理框架,相比其他后台功能丰富管理系统,这个后台管理系统可以用干净简洁来形容--Nova-admin Nova-admin Nova-admin 是一个基于Vue3.Vite ...

  10. JS常用的工具方法

    记录一些经常使用的JS通用工具方法,代码来自互联网,佛性更新 空字符串校验 /** * 判断字符串是不是NULL或空串或空格组成 * @param str 被判断的字符串 * @return {boo ...