题意

定义:字符串s 为一个c-好串(c 为一个字符)时,必须满足:

  1. 当\(|s| = 1\) ,\(s = c\)

  2. 当\(|s| > 1\), \(s\) 的左半部分为全为 \(c\),右半部分为一个 (c+1)-好串 或者 \(s\) 的右半部分为全为 \(c\),左半部分为一个 (c+1)-好串

其中 \(|s|\) 代表 字符串 \(s\) 的长度。

举个例子:当 \(s=“cdbbaaaa"\)时,\(s\) 是一个 a-好串

现在,给你一个字符串 \(s\) ( \(|s| = 2^k\) ),问最少替换多少个字符,使其为一个 a-好串

思路

我们可以按照题意递归求解。

返回边界 : 当前串长度为 1

每次将串分成左右两部分,分类讨论,最后取最小值作为答案。

具体见代码。

代码

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath> #define ll long long
using namespace std; const int MAXN = 131075;
int n;
char s[MAXN];
// getans 代表将[l,r] 变为一个 c-好串 所需最小改动
int getans(int l,int r,char c){
if(l==r) return s[l]!=c; // 如果该串已经符合要求,则不需要改动,返回 0
int tot1 = 0,tot2 = 0;
int mid = (l+r)>>1;
for(int i = l;i <= mid;i++) if(s[i]!=c) tot1++;
for(int i = mid+1;i <= r;i++) if(s[i]!=c) tot2++;
tot1 += getans(mid+1,r,c+1);
tot2 += getans(l,mid,c+1);
return min(tot1,tot2);
// tot1 代表将左区间全变为 c, 右区间变为一个c+1 好串所需最小改动
// tot2 代表将右区间全变为 c, 左区间变为一个c+1 好串所需最小改动
}
int main (){
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
scanf("%s",s+1);
printf("%d\n",getans(1,n,'a'));
}
}

题解 CF1385D 【a-Good String】的更多相关文章

  1. PAT甲题题解-1040. Longest Symmetric String (25)-求最长回文子串

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789177.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  2. 题解 CF1354B 【Ternary String】

    题意 给出一个字符串,只包含 \({1,2}\) 或 \({3}\) .从中找出一个长度最短的子串,要求至少包含 \({1,2,3}\) 各一次,并输出其长度. 输入格式 本题有多组测试数据 第一行一 ...

  3. 【题解】UVA10298 Power String(KMP)

    UVA10298:https://www.luogu.org/problemnew/show/UVA10298 思路 设P[x]数组为 前x个字符的最大前缀长度等于后缀字串 由P数组的定义我们可以知道 ...

  4. 「题解」Just A String

    目录 题目 原题目 简易题意 思路及分析 代码 题目 原题目 点这里 简易题意 现定义一个合法的字符串满足将其打散并任意组合之后能够形成回文串. 给你 \(m\) 种字母,问随机构成长度为 \(n\) ...

  5. LeetCode Reverse String II

    原题链接在这里:https://leetcode.com/problems/reverse-string-ii/#/description 题目: Given a string and an inte ...

  6. Mediocre String Problem (2018南京M,回文+LCP 3×3=9种做法 %%%千年好题 感谢"Grunt"大佬的细心讲解)

    layout: post title: Mediocre String Problem (2018南京M,回文+LCP 3×3=9种做法 %%%千年好题 感谢"Grunt"大佬的细 ...

  7. LeetCode Add Strings

    原题链接在这里:https://leetcode.com/problems/add-strings/ 题目: Given two non-negative numbers num1 and num2  ...

  8. 266. Palindrome Permutation

    题目: Given a string, determine if a permutation of the string could form a palindrome. For example,&q ...

  9. [LeetCode] 3. Longest Substring Without Repeating Characters 解题思路

    Given a string, find the length of the longest substring without repeating characters. For example, ...

随机推荐

  1. 11、vue-路由

    1.路由: 官方提供一个插件,构建单页面应用,主要实现得功能页面得切换.组件得跳转 2.vue中得路由:vue-router包,如果是脚手架进行搭建得,那么是不需要安装vue-router这个包得,因 ...

  2. python 获取两位的月份(09)和天数(09)

  3. el-table表头与内容右边框错位问题

    在用element写一个后台管理系统时遇到一个坑,el-table标签渲染出数据后表头th和内容会有错位,之前没有的 修改大小都没用 于是看百度搜索一波最终解决修改之前 虽然不大 但是别扭 在全局添加 ...

  4. Python 简明教程 --- 19,Python 类与对象

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 那些能用计算机迅速解决的问题,就别用手做了. -- Tom Duff 目录 上一节 我们介绍了Pyt ...

  5. 入门大数据---Spark车辆监控项目

    一.项目简介 这是一个车辆监控项目.主要实现了三个功能: 1.计算每一个区域车流量最多的前3条道路. 2.计算道路转换率 3.实时统计道路拥堵情况(当前时间,卡口编号,车辆总数,速度总数,平均速度) ...

  6. FreeSql 使用 ToTreeList/AsTreeCte 查询无限级分类表

    关于无限级分类 第一种方案: 使用递归算法,也是使用频率最多的,大部分开源程序也是这么处理,不过一般都只用到四级分类. 这种算法的数据库结构设计最为简单.category表中一个字段id,一个字段fi ...

  7. 基于小程序请求接口 wx.request 封装的类 axios 请求

    基于小程序请求接口 wx.request 封装的类 axios 请求 Introduction wx.request 的配置.axios 的调用方式 源码戳我 feature 支持 wx.reques ...

  8. idea 启动官网spring boot demo 报错

    *************************** APPLICATION FAILED TO START *************************** Description: Fai ...

  9. (一)ELK 部署

    官网地址:https://www.elastic.co/cn/ ELK是Elasticsearch.Logstash.Kibana的简称,这三者是核心套件,但并非全部.   Elasticsearch ...

  10. ZJOI2008 骑士(树型DP)

    ZJOI2008 骑士 题目大意 给出n个人的战斗力和每个人讨厌的人,然后问最大能有多大的战斗力 solution 简单粗暴的题意,有一丢丢背包的感觉 那敢情就是DP了 有点像没有上司的舞会,,, 根 ...