题目
题目链接: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;
}