CF1385D a-Good String(分治)

一种分治的思想,看每次的左右区间,找一个需要更改小的进行更改,然后对另一个区间进行继续往下分治的更改。

#include<cstdio>
#include<iostream>
using namespace std;
int T,n;
char s[200005];
int solve(int l,int r,char c){
	if(l==r){
		if(s[l]==c) return 0;
		return 1;
	}
	int cnt=0,tot=0;
	int mid=(l+r)>>1;
	for(int i=l;i<=mid;i++){
		if(s[i]!=c) cnt++;
	}
	for(int i=mid+1;i<=r;i++){
		if(s[i]!=c) tot++;
	}
	cnt+=solve(mid+1,r,(char)(c+1));
	tot+=solve(l,mid,(char)(c+1));
	return min(cnt,tot);
}
int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		scanf("%s",s+1);
		printf("%d\n",solve(1,n,'a'));
	}
	return 0;
}
上一篇:E. Bored Bakry


下一篇:IDA Python提取数据