Codeforces #656 Problem D

题面

You are given a string s[1…n] consisting of lowercase Latin letters. It is guaranteed that n=2k for some integer k≥0.

The string s[1…n] is called c-good if at least one of the following three conditions is satisfied:

The length of s is 1, and it consists of the character c (i.e. s1=c);
The length of s is greater than 1, the first half of the string consists of only the character c (i.e. s1=s2=⋯=sn2=c) and the second half of the string (i.e. the string sn2+1sn2+2…sn) is a (c+1)-good string;
The length of s is greater than 1, the second half of the string consists of only the character c (i.e. sn2+1=sn2+2=⋯=sn=c) and the first half of the string (i.e. the string s1s2…sn2) is a (c+1)-good string.
For example: "aabc" is 'a'-good, "ffgheeee" is 'e'-good.

In one move, you can choose one index i from 1 to n and replace si with any lowercase Latin letter (any character from 'a' to 'z').

Your task is to find the minimum number of moves required to obtain an 'a'-good string from s (i.e. c-good string for c= 'a'). It is guaranteed that the answer always exists.

You have to answer t independent test cases.

Another example of an 'a'-good string is as follows. Consider the string s="cdbbaaaa". It is an 'a'-good string, because:

the second half of the string ("aaaa") consists of only the character 'a';
the first half of the string ("cdbb") is 'b'-good string, because:
the second half of the string ("bb") consists of only the character 'b';
the first half of the string ("cd") is 'c'-good string, because:
the first half of the string ("c") consists of only the character 'c';
the second half of the string ("d") is 'd'-good string.
Input
The first line of the input contains one integer t (1≤t≤2⋅104) — the number of test cases. Then t test cases follow.

The first line of the test case contains one integer n (1≤n≤131 072) — the length of s. It is guaranteed that n=2k for some integer k≥0. The second line of the test case contains the string s consisting of n lowercase Latin letters.

It is guaranteed that the sum of n does not exceed 2⋅105 (∑n≤2⋅105).

Output
For each test case, print the answer — the minimum number of moves required to obtain an 'a'-good string from s (i.e. c-good string with c= 'a'). It is guaranteed that the answer exists.

Example
inputCopy
6
8
bbdcaaaa
8
asdfghjk
8
ceaaaabb
8
bbaaddcc
1
z
2
ac
outputCopy
0
7
4
5
1
1

思路

不得不说,cf这题目是真的臭长。自己模拟一下就知道是个递归了,直接搜就可以了。

代码实现

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<set>
#include<queue>
#include<map>
using namespace std;
typedef long long ll;
const int maxn=131100;
char s[maxn];
int cacl (int l,int r,char ans) {
    int res=0;
    for (int i=l;i<=r;i++)   {
        if (s[i]!=ans) res++;
    }
    return res;
}
inline int dfs (int l,int r,char ans) {
    if (l==r) return cacl (l,r,ans);
    int t=1e9;
    int mid=(l+r)>>1;
    t=min (t,dfs (l,mid,ans+1)+cacl (mid+1,r,ans));
    t=min (t,dfs (mid+1,r,ans+1)+cacl (l,mid,ans));
    return t;
}
int main () {
    int t;
    cin>>t;
    while (t--) {
        int n;
        cin>>n;
        cin>>s;
        char temp='a';
        cout<<dfs (0,n-1,temp)<<endl;
    } 
    return 0;
}
posted @ 2020-07-18 16:28  Luglucky  阅读(174)  评论(0编辑  收藏  举报