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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章