题意:
构造一个字典序最小的字符串s同时满足长度与串AB相等,并且与A的汉明距离等于与B的汉明距离。 两个字符串的汉明距离等于它们不相等的位数,如abc和acb汉明距离为2
思路:
贪心地构造前缀a尽可能多的字符串 但并不需要特殊考虑a,可以直接从a到z枚举合适的
一开始写复杂了,实际上有很简单的写法,即代码
f[i]表示第i位之后两个字符串的距离差最大为多少, now记录当前两个字符串距离差,从前到后枚举每一位,只要当前的距离差绝对值不大于后面的,就可以贪心地取当前可以取到的最小字符。
check函数不要忘记给z加绝对值!
#include <iostream>
// #include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
#define pb push_back
#define LL int
int t = 0;
int now; //记录当前两个字符串距离差
int f[maxn]; //f[i]表示第i位之后两个字符串的距离差最大为多少
string a, b;
bool check(char c, int i) {
int z = now;
if(c == a[i]) z++;
if(c == b[i]) z--;
if(abs(z) <= f[i+1]) return true; //只要当前的距离差不大于后面的,就可以贪心地取最小
return false;
}
void solve() {
now = 0;
cin >> a >> b;
int n = a.length();
f[n] = 0;
for(int i = n-1; i >= 0; i--) f[i] = f[i+1] + (a[i] != b[i]);
string s;
for(int i = 0; i < n; i++) {
for(char c = 'a'; c <= 'z'; c++) {
if(!check(c, i)) continue;
if(c == a[i]) now++;
if(c == b[i]) now--;
s += c;
break;
}
}
cout << s << '\n';
}
int main()
{
int T; cin >> T; while(T--) {
cout << "Case " << ++t << ": ";
solve();
}
return 0;
}