题目链接:https://codeforces.com/contest/1385/problem/D
题意
一个小写字母串称为 $c-good string$,如果至少满足以下条件之一:
- 字符串长度为 $1$,包含字母 $c$
- 字符串前一半都为字母 $c$,后一半为 $(c+1)-good string$
- 字符串后一半都为字母 $c$,前一半为 $(c+1)-good string$
计算将一个长为 $n = 2^k$ 的小写字母串变为 $a-good string$ 至少需要替换多少个字符。
题解
递归枚举所有情况即可。
代码
#include <bits/stdc++.h> using namespace std; int n; string s; int dfs(int l, int r, char c) { if (l + 1 == r) return s[l] != c; int l1 = l, r1 = l + (r - l) / 2; int cnt1 = r1 - l1 - count(s.begin() + l1, s.begin() + r1, c); int l2 = l + (r - l) / 2, r2 = r; int cnt2 = r2 - l2 - count(s.begin() + l2, s.begin() + r2, c); return min(cnt1 + dfs(l2, r2, c + 1), cnt2 + dfs(l1, r1, c + 1)); } void solve() { cin >> n >> s; cout << dfs(0, n, 'a') << " "; } int main() { int t; cin >> t; while (t--) solve(); }