贪心

管他那么多,贪心最大嘛

Hamming Distance Gym - 102823H

题意:给两个长度<1e4一样的字符串a,b。求一个串长一样的最小字典序字符串c,使得(c,a)==(c,b),(x,y)是指x与y的海明距离。

点击查看思路
  

思路:贪心即可。
贪心的每次放字典序最小的字母,满足修改量 <=后面的不相等字母对数即可放。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/*
* @Author: Marhoosh
* @Date: 2021-10-11 11:00:11
* @Last Modified by: Marhoosh
* @Last Modified time: 2021-10-30 18:09:58
*/
#include<bits/stdc++.h>
using namespace std;
#define Debug(x) cout<<#x<<':'<<x<<endl
#define INF 0x7fffffff
typedef long long ll;
typedef pair<ll,ll> P;
const ll maxn=1e4+11;
ll sum[maxn];
string ar,br;
void solve(){
ll l=ar.length();
sum[l]=0;
for(ll i=l-1;i>=0;i--){
sum[i]=sum[i+1]+(ar[i]!=br[i]);
}
ll cnt1=0,cnt2=0;
for(ll i=0;i<l;i++){
for(ll j=0;j<26;j++){
char x='a';
x+=j;
ll flag1=0,flag2=0;
if(x!=ar[i]) flag1++;
if(x!=br[i]) flag2++;
if(abs(cnt1+flag1-cnt2-flag2)<=sum[i+1]){
cout<<x;
cnt1+=flag1,cnt2+=flag2;
break;
}
}
}
cout<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
ll ca;cin>>ca;
ll t=1;
while(ca--){
cin>>ar>>br;
cout<<"Case "<<t++<<": ";
solve();
}
return 0;
}