// 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;
}
标签:good,return,String,int,CF,整数,Good,字符串,长度
From: https://www.cnblogs.com/itdef/p/18648445