Atcoder Regular Round #151 A题 Equal Hamming Distances 题解

题意:

定义 \(Hamming\) 距离为两个 \(01\) 字符串中下标相同且字符不同的字符对的数量,问是否可以构造一个字符串 \(u\) 满足 \(Hamming(s,u)=Hamming(t,u)\)

思路:

如果 \(Hamming(s,t)\) 满足 \(Hamming(s,t)\bmod 2 = 1\),那么 \(Hamming(s,t)\) 就是无解的。

否则,如果 \(s_i \neq t_i\),那么设 \(c=Hamming(s,t)/2\),只要 \(s\)\(t\) 和构造串的 \(Hamming\) 距离 \(\le c\),那么就填 \(1\),否则填 \(0\)

然后直接构造即可。时间复杂度 \(\mathcal O(n)\)

#include <bits/stdc++.h>

using namespace std;

int Hamming(string &s, string &t)
{
  int cnt = 0;
  for (int i = 0; i < s.size(); i ++)
    if (s[i] != t[i])
      cnt ++;
  return cnt;
}

signed main()
{
  int n;
  cin >> n;
  string s, t;
  cin >> s >> t;
  int cntst = Hamming(s, t);
  if (cntst & 1)
    cout << "-1\n";
  else
  {
    int cf = cntst >> 1;
    int cnt0 = 0, cnt1 = 0;
    string u;
    for (int i = 0; i < s.size(); i ++)
      if (s[i] == t[i])
        u += '0';
      else // s[i] != t[i]
      {
        if (s[i] == '0' && cnt0 < cf)
        {
          u += '0';
          if (s[i] == '0')
            cnt0 ++;
          else
            cnt1 ++;
        }
        else if (s[i] == '1' && cnt1 < cf)
        {
          u += '0';
          if (s[i] == '0')
            cnt0 ++;
          else
            cnt1 ++;
        }
        else
        {
          u += '1';
          if (s[i] == '0')
            cnt1 ++;
          else
            cnt0 ++;
        }
      }
    cout << u << '\n';
  }
  return 0;
}

posted @ 2022-10-22 18:25  yhbqwq  阅读(24)  评论(0编辑  收藏  举报