[dfs] cf 1385

题目

题目链接:https://codeforces.ml/contest/1385/problem/D

思路

dfs找出所有情况
自闭了 想复杂了 写了一个小时的假算法 我怎么这么菜
呜呜呜

代码

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cctype>
#include<ctime>
#include<iostream>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<iomanip>
#include<list>
#include<bitset>
#include<sstream>
#include<fstream>
#include<complex>
#include<algorithm>
#if __cplusplus >= 201103L
#include <unordered_map>
#include <unordered_set>
#endif
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
map<char,int> mp[1005010];
int ans=0;
string s;
void dfs(int l,int r,char c,int res,int n){
	int mid=(l+r)>>1;
	if(l==r){
		if(s[l]!=c) res++;
	//	cout<<res<<endl;
		ans=min(ans,res);
		return;
	}
	int res1=n/2-(mp[mid][c]-(l==0?0:mp[l-1][c]));
	int res2=n/2-(mp[r][c]-mp[mid][c]);
//	cout<<res1<<" "<<res2<<endl;
	dfs(l,mid,c+1,res+res2,n/2);
	dfs(mid+1,r,c+1,res+res1,n/2);
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t;
	cin>>t;
	while(t--){
		int n;
		cin>>n;
		cin>>s;
		for(char cc='a';cc<='z';cc++){
				mp[0][cc]=0;
			}	 
		int len=s.size();
		for(int i=0;i<len;i++){
			for(char cc='a';cc<='z';cc++){
				if(i!=0) mp[i][cc]=mp[i-1][cc];
			}
			mp[i][s[i]]++;
		}
		ans=INF;
		dfs(0,len-1,'a',0,len);
		cout<<ans<<endl;
	}
    return 0;
}

猜你喜欢

转载自blog.csdn.net/kosf_/article/details/107421773
今日推荐