602 [CF 1385D] a-Good String

// 602 [CF 1385D] a-Good String.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
http://oj.daimayuan.top/course/22/problem/978

给你一个长度为 n的由小写字母组成的字符串 s,保证 n=2k,其中 k为大于等于零的整数。
一个非空字符串 s被称为 c-good(c为 a...z中的某个字母)的,需要满足下列三个条件之一:

s长度为 1,且只含有 c字符;

s长度大于 1,且 s的前一半全为字符 c,
后一半为 next(c)-good的字符串,其中 next(c)表示 c后面的那一个字母;

s长度大于 1,且 s的前一半为 next(c)-good的字符串,后一半全为字符 c;

例如 aabc 是 a-good的,ffgheeee 是 e-good的。

对于给定的字符串 s,请求出最少改变 s中几个字符可以把它变成 a-good的字符串。

输入格式
输入有多组询问。

第一行一个整数 T 表示数据组数。

对于每组数据包含两行,第一行一个整数 n,第二行一个长度为 n的字符串 s。

输出格式
对于每组数据,输出一行一个整数表示答案。

样例输入
5
8
bbdcaaaa
8
asdfghjk
8
ceaaaabb
8
bbaaddcc
1
z



1
8
ffgheeee

样例输出
0
7
4
5
1
数据规模
对于 100%的数据,保证 1≤T≤5,1≤n≤131072
,保证 n=2k,其中 k为大于等于零的整数。
*/


#include <iostream>
#include <string>


using namespace std;

int n, T;
string str;


int calc(int l, int r, char x) {
	if (l == r) {
		if (str[l] == x) {
			return 0;
		}
		return 1;
	}

	int m = (l + r) >> 1;

	int res1 = calc(l, m, x + 1);
	int res2 = calc(m + 1, r, x + 1);

	for (int i = l; i <= m; i++) {
		if (str[i] != x) {
			res2++;
		}
	}

	for (int i = m + 1; i <= r; i++) {
		if (str[i] != x) {
			res1++;
		}
	}

	return min(res1,res2);
}


void solve() {
	cin >> n >> str;

	cout << calc(0, n - 1, 'a') << endl;

	return;
}

int main()
{
	cin >> T;
	while (T--) {
		solve();
	}
 

	return 0;
}

 

posted on   itdef  阅读(3)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2023-01-02 220. 最长公共子序列问题(挑战程序设计竞赛)
2023-01-02 213. 字典序最小问题 Best Cow Line(挑战程序设计竞赛)
2018-01-02 windows下使用redis c++

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示