D. a-Good String【分治】

  1. 链接

    D. a-Good String

  2. 题意
    一个小写字母串称为 c−good stringc−good string,如果至少满足以下条件之一:

    • 字符串长度为 1,包含字母 c
    • 字符串前一半都为字母 c,后一半为 (c+1)−good string
    • 字符串后一半都为字母 c,前一半为 (c+1)−good string

    计算将一个长为 n=2k的小写字母串变为a−good string 至少需要替换多少个字符。

  3. 思路

    分治,类似与归并排序,注意一下边界的处理

  4. 代码

    #include
    using namespace std;
    
    typedef long long ll;
    const int maxn = 2e5+10;
    const int mod = 1e9+7;
    
    int a[maxn];
    string s;
    int work(int l,int r,char ch){
    	if(l+1==r){
    		return s[l]!=ch;
    	}
    	int mid = (l+r)/2;
    	int cntl = 0;
    	int cntr = 0;
    	for(int i = l; i < r; i++){
    		if(i<mid) cntl += (s[i]!=ch);
    		else cntr += (s[i]!=ch);
    	}
    	return min(cntl+work(mid,r,ch+1),cntr+work(l,mid,ch+1));
    }
    int main(void){
    	int t;
    	cin >> t;
    	while(t--){
    		int n;
    		cin >> n;
    		cin >> s;
    		cout<<work(0,n,'a')<<endl;
    	}
    	return 0;
    }
    
    

你可能感兴趣的:(分治)