题目链接: a-Good String
大致题意:
给定一个长度为n = 2k的字符串. 且有如下定义
如果一个串的长度为1, 则称为 X-good串 (X为小写字母)
否则如果串的长度大于1, 如果前半部分只包含字符X, 则称为X-good串, 则后半段应该为(X+1)-good串, 反之亦然.
现在给定你一个字符串, 你可以将其中的一个字符修改成任意的小写字母, 问至少修改多少次可以使串为a-good串.
解题思路:
分治求解, 枚举每一种情况即可. 复杂度为nlogn
AC代码:
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= n; ++i)
using namespace std;
typedef long long ll;
const int N = 2E5;
char s[N];
int n;
int dfs(int l, int r, char c, int num = 0) {
if (l >= r) return num + (s[l] != c);
int mid = (l + r) >> 1; //分界点
//modify left
int cou1 = 0, cou2 = 0;
for (int i = l; i <= mid; ++i)
if (s[i] != c) cou1++;
int res1 = dfs(mid + 1, r, c + 1, num + cou1);
//modify right
for (int i = mid + 1; i <= r; ++i)
if (s[i] != c) cou2++;
int res2 = dfs(l, mid, c + 1, num + cou2);
return min(res1, res2);
}
int main()
{
int t; cin >> t;
while (t--) {
cin >> n;
scanf("%s", s + 1);
printf("%d\n", dfs(1, n, 'a'));
}
return 0;
}
这个题当时理解错了呀, 但是某名奇妙就打对了= =, AC后想了半天