liyunhe
2024-11-24 09:19:44
首先,在一个位置放上字母,不相似度为其他地方不是这个字母的个数。
我们可以定义新相似度为其他地方是这个字母的数量,这样的话每一个位置上的不相似度和新相似度加起来正好就是
如果暴力枚举的话。时间一定会超。所以先预处理,将每个字母的数量先统计出来。然后最小化相似度,找一个字母 cnt[j]-(j==s[i]?1:0)
。
#include<bits/stdc++.h>
int cnt[131];
using namespace std;
int main() {
int n;string s;
cin>>n>>s;
for(int i=0;i<n;i++)cnt[s[i]]++;
for(int i=0;i<n;i++){
char ans=s[i];
for(char j='a';j<='z';j+=1){
if(cnt[j]-(j==s[i]?1:0)<cnt[ans]-(ans==s[i]?1:0)){
ans=j;
}
}
cout<<ans;
}
return 0;
}