题面传送门

解决思路

题目大意是给你一个字符串 \(s\) ,定义一次操作为对于长度为 \(3\) 的一个子段,满足 \(s_i=s_{i+1}\ne s_{i+2}\),则可以将 \(s_{i+2}\) 变为 \(s_i\) 。问最多可以操作多少次。

首先可以对照样例三找出规律。对于样例三 anerroroccurred,最优的操作方法是:

  • 先 \(2\) 后变成 anerroroccurrrr(改 r

  • 再 \(5\) 次变成 anerroroccccccc(改 c

  • 再 \(9\) 次变成 anerrrrrrrrrrrr(改 r

可以发现,最优策略是从后往前找,每次找到可以操作的,就把它后面的所有字母都变成一样的。

假设字符串长度为 \(n\),并且 \(s_i=s_{i+1}\),则可以操作的次数是 \(n-(i+2)-(sum_{s_i}-2)\),其中,\(n-(i+2)\) 算出之后有几个字符。\(sum_{s_i}\) 表示:当前字符串当前操作位置及之后位置 有多少个字符为 \(s_i\) 。因为重复的字符不能操作,所以要减掉,又因为第 \(s_i,s_{i+1}\) 位不算,所以减 \(2\)。

一次修改后,之后的字符都变相同了,所以将 \(sum\) 清空,同时赋 \(sum_{s_i}\) 为 \(n-i\)。

AC Code

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
#define TIE cin.tie(0),cout.tie(0)
#define int long long
using namespace std;
string s;
int sum[200],ans;
signed main(){
IOS;TIE;
cin>>s;
sum[s[s.size()-1]]++;
sum[s[s.size()-2]]++;
for(int i=s.size()-3;i>=0;i--){
sum[s[i]]++;
if(s[i]==s[i+1]&&s[i+1]!=s[i+2]){
ans+=s.size()-i-sum[s[i]];
for(int j='a';j<='z';j++) sum[j]=0;
sum[s[i]]=s.size()-i;
}
}
cout<<ans<<endl;
return 0;
}

最新文章

  1. Delphi 关键字详解[整理于 &quot;橙子&quot; 的帖子]
  2. VS2013常用快捷键你敢不会?
  3. 【kAri OJ604】圣哲的树
  4. 批量update
  5. K需要修改的内容
  6. C#学习笔记13:静态方法、方法重载和ref、out参数
  7. BZOJ 4034: [HAOI2015]T2( 树链剖分 )
  8. Linux安装Discuz
  9. 看看.NET Core几个Options的简单使用
  10. Uva12174 Shuffle(滑动窗口)
  11. 【CentOS】JDK的安装
  12. HDU 5552 Bus Routes(NTT+分治)
  13. elastic search 查询
  14. 在Brackets中使用Emmet
  15. oel5.5安装mysql数据库初始化报错解决办法
  16. 深度学习之神经网络核心原理与算法-caffe&amp;keras框架图片分类
  17. 自动下载和安装 MNIST 到 TensorFlow 的 python 源码 (转)
  18. 51NOD 1353:树——题解
  19. 数字图像处理,图像锐化算法的C++实现
  20. 手机端 html 页面

热门文章

  1. DataGridVIew控件绑定数据之后的,增、插、删操作
  2. 如何查找并简单分析core文件
  3. 安装docker及使用docker安装其他软件(手动挂载数据卷)
  4. VLDB&#39;22 HiEngine极致RTO论文解读
  5. .NET 6当中的Web API版本控制
  6. 第六章:Django 综合篇 - 15:Django与缓存
  7. 第六章:Django 综合篇 - 5:自定义django-admin命令
  8. Vue子-&gt;父组件传值
  9. python实现给定K个字符数组,从这k个字符数组中任意取一个字符串,按顺序拼接,列出所有可能的字符串组合结果!
  10. MySQL基础、MySQL安装和MariaDB安装