Problem:
ヒットアンドブロー

太郎君と花子さんはヒットアンドブローで遊ぶことにしました。ヒットアンドブローのルールは、以下の通りです。

出題者と回答者に分かれて行う。

出題者は、重複した数を含まない 4 桁の数字(正解)を決める。

回答者は、その 4 桁の数字(回答)を言い当てる。

回答に対して、出題者はヒットとブローの数でヒントを与える。

回答と正解を比べて、数と桁位置の両方が同じであることをヒットと呼び、数だけが同じで桁位置が異なることをブローと呼ぶ。たとえば、正解が 1234 で、回答が 1354 なら、出題者は「2 ヒット、1 ブロー」というヒントを与え、正解までこれを繰り返す。

出題者と回答者は交代してゲームを行い、より少ない回答で正解を言い当てた方を勝ちとする。

太郎君と花子さんは、ヒットの数とブローの数をその都度判断することが少し面倒に感じているようです。そんな二人のために、ヒットの数とブローの数が即座に分かるプログラムを作成してあげましょう。

正解 r と回答 a を入力とし、ヒットの数とブローの数を出力するプログラムを作成してください。r、a はそれぞれ 0 から 9 の数字 4 つからなる数字の列です。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロふたつの行で示されます。各データセットとして、r と a が空白区切りで１行に与えられます。

データセットの数は 12000 を超えません。

Output

入力データセットごとに、ヒットの数とブローの数を１行に出力します。

Sample Input

1234 5678
1234 1354
1234 1234
1230 1023
0123 1234
0 0

Output for the Sample Input

0 0
2 1
4 0
1 3
0 3

Solution in C++ (judge verdict: Accepted)

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

typedef long long ll;
typedef pair<int, int> P;

#define pb push_back
#define rep(i, a, n) for(int i = (a); i < (n); i++)
#define dep(i, a, n) for(int i = (a); i >= (n); i--)
#define mod 1e9+7

__attribute__((constructor))
void initial() {
  cin.tie(0);
  ios::sync_with_stdio(false);
}

int main() {
  string a, b;
  while(cin >> a >> b) {
    if(a == "0") break;
    map<char, int> mp;
    int hit = 0;
    int br = 0;
    rep(i, 0, 4) {
      if(a[i] == b[i]) hit++;
      else {
        if(mp[a[i]]) {
          mp[a[i]] = 0;
          br++;
        }else mp[a[i]] = 1;
        if(mp[b[i]]) {
          mp[b[i]] = 0;
          br++;
        }else mp[b[i]] = 1;
      }
    }

    cout << hit << " " << br << endl;
  }
}