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 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| #include <bits/stdc++.h> using namespace std; const int maxn = 1e2 + 50; int N, cnt, mp[maxn], q[maxn]; string a, b, c; bool v[maxn];
bool pd() { int p = -1; for (int i = N - 1; i >= 0; --i) { if (~mp[a[i]] && ~mp[b[i]] && ~mp[c[i]]) { int sum = mp[a[i]] + mp[b[i]]; if (~p) { sum += p; p = sum / N, sum %= N; if (sum != mp[c[i]]) return 0; if (!i && p) return 0; } else { int s1 = sum + 0, s2 = sum + 1; if ((s1 % N != mp[c[i]]) && (s2 % N != mp[c[i]])) return 0; if (!i && (s1 % N == mp[c[i]]) && s1 >= N) return 0; if (!i && (s2 % N == mp[c[i]]) && s2 >= N) return 0; } } else { p = -1; } } return 1; }
bool dfs(int now) { if (now == N) return 1; for (int i = N - 1; i >= 0; --i) { if (v[i]) continue; mp[q[now]] = i, v[i] = 1; if (pd() && dfs(now + 1)) return 1; mp[q[now]] = -1, v[i] = 0; } return 0; }
int main() { cin >> N >> a >> b >> c; for (int i = N - 1; i >= 0; --i) { if (!v[a[i]]) q[cnt++] = a[i], v[a[i]] = 1; if (!v[b[i]]) q[cnt++] = b[i], v[b[i]] = 1; if (!v[c[i]]) q[cnt++] = c[i], v[c[i]] = 1; } memset(mp, -1, sizeof(mp)); memset(v, 0, sizeof(v)); dfs(0); for (int i = 'A'; i < 'A' + N; ++i) cout << mp[i] << " "; return 0; }
|