题目大意:
给定一个字符串s,长度为2的幂次我们规定一个字符串叫做c-good,如果它满足以下任意一个条件1.字符串长度是1,只包含字母c
2.字符串长度大于1,左半边都是c,右半边为(c+1)-good
3.字符串长度大于1,右半边都是c,左半边为(c+1)-good
解题思路:
因为是2的幂次长度,所以可以用二分的思想,比较左区间和右区间需要变动的字符串长度大小,在递归至下一层。代码:
#include<bits/stdc++.h>
using namespace std;
template <typename T>inline void read(T& t){
char c=getchar();t=0;
int f=1;
while(!isdigit(c)){
if(c=='-')f=-1;
c=getchar();
}
while(isdigit(c))t=t*10+c-48,c=getchar();
t=f*t;
}
template <typename T,typename... Args> inline void read(T& t,Args&... args){
read(t);read(args...);
}
int n;
char a[200050];
int binary(int l,int r,char c){
if(l==r){
return a[l]!=c;//不匹配加1
}
int mid=l+r>>1;
int left=0,right=0;
for(int i=l;i<=mid;i++){
left+=a[i]!=c;
}
for(int i=mid+1;i<=r;i++){
right+=a[i]!=c;
}
return min(left+binary(mid+1,r,c+1),binary(l,mid,c+1)+right);
}
int main(){
int t;
read(t);
while(t--){
read(n);
scanf("%s",a+1);
printf("%d\n",binary(1,n,'a'));
}
return 0;
}