题目链接:http://oj.daimayuan.top/course/22/problem/978
做法:分治思想
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e6+10;
int n;
int a[N],c[N];
char s[N];
int solve(int l,int r,int x){//由l到r的字符串转化为x-good函数
if(l==r){//如果仅有一个字母,判断是否是x,不是则说明需要操作一次,否则不用操作
if(x==s[l]) return 0;
else return 1;
}
int m=(l+r)>>1;
int y1=0,y2=0;//y1:左边有多少个跟x不一样的数 y2:右边有多少个跟x不一样的数
for(int i=l;i<=m;i++){
if(s[i]!=x) y1++;
}
for(int i=m+1;i<=r;i++){
if(s[i]!=x) y2++;
}
return min(y1+solve(m+1,r,x+1),y2+solve(l,m,x+1));
}
signed main(){
int T;cin>>T;
while(T--){
cin>>n>>s+1;
cout<<solve(1,n,'a')<<"\n";
}
}