Codeforces Round #656 (Div. 3) D. a-Good String

题目链接: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();
}
原文地址:https://www.cnblogs.com/Kanoon/p/13334275.html