全国統一プログラミング王決定戦予選B

問題概要

3つの文字列\(A, B, C\)が与えられる。これらはそれぞれ、英小文字からなる長さ\(N\)の文字列である。

目標: これら3つの長さを等しくすること

操作: 文字列\(A, B, C\)のうち1つを選び、さらに\(1\)以上\(N\)以下の整数\(i\)を指定する。そして、選んだ文字列の先頭から\(i\)文字目を別のなんらかの英小文字に変更する。

この操作を行う最小回数を求めよ。

制約

  • \(1 ≤ N ≤ 100\)
  • \(A, B, C\)はそれぞれ長さ\(N\)の文字列
  • \(A, B, C\)の各文字列は英小文字である。

考えたこと

  • i番目の文字が全て等しければ、変更しない
  • i番目の文字が1つだけ異なれば、その異なる文字を変更
  • i番目の文字が全て異なれば、どれかに合わせるために、2つの文字列を変更

これをどう実装しようか考えると、setという数学的集合を表現できるライブラリを用いると良さそうだとわかる。

setを毎回宣言し、それの長さ-1文字を変更すれば良いので、以下のようなコードになる。

#include<bits/stdc++.h>
using namespace std;

int main() {
  int n; cin >> n;
  string a, b, c; cin >> a >> b >> c;
  int ans = 0;

  for(int i = 0; i < n; i++) {
    set<char> st;
    st.insert(a[i]);
    st.insert(b[i]);
    st.insert(c[i]);
    ans += st.size() - 1;
  }
  
  cout << ans << endl;
  return 0;
}