#include <bits/stdc++.h>
using namespace std;
int n , jww;
string p1 , p2 , h;
bool flag[30];
int num[30];
bool ok = false;
void print()
{
for (int i = 1 ; i <= n ; i++)
{
cout << num[i] << " ";
}
cout << endl;
}
int pluss(int a , int b , int c)
{
int x = floor((a + b + c) * 1.0 / n) * 100;
x = x + ((a + b + c) % n);
return x;
}
void dfs(int step , int t , int l1 , int l2 , int jw)
{
if (ok) return ;
if (step == n + 1)
{
print();
ok = 1;
return ;
}
if (t == 3)
{
int it = num[h[step - 1] - 'A' + 1] , k1;
// cout << step << " " << l1 << " " << l2 << " ";
if (it != -1)
{
// cout << pluss(it , 0 , 0) << " " << it << " yyy" << endl;
if ((pluss(l1 , l2 , jw) % 100) != pluss(it , 0 , 0))
{
// cout << jw << endl;
return;
}
jww = pluss(l1 , l2 , jw) / 100;
}
else
{
k1 = pluss(l1 , l2 , jw);
if (flag[k1 % 100])
{
// cout << jw << endl;
return;
}
jww = k1 / 100;
num[h[step - 1] - 'A' + 1] = k1 % 100;
// cout << h[step - 1] << endl;
flag[k1 % 100] = 1;
}
dfs(step + 1 , 1 , -1 , -1 , jww);
//回溯
if (it == -1)
{
num[h[step - 1] - 'A' + 1] = -1;
flag[k1 % 100] = 0;
}
if (ok) return ;
return ;
}
for (int i = n - 1 ; i >= 0 ; i--)
{
if (ok) return ;
if (t == 1 && num[p1[step - 1] - 'A' + 1] != -1)
{
dfs(step , t + 1 , num[p1[step - 1] - 'A' + 1] , -1 , jw);
if (ok) return ;
break;
}
else if (t == 2 && num[p2[step - 1] - 'A' + 1] != -1)
{
dfs(step , t + 1 , l1 , num[p2[step - 1] - 'A' + 1] , jw);
if (ok) return ;
break;
}
if (flag[i]) continue;
if (t == 1)
{
num[p1[step - 1] - 'A' + 1] = i;
flag[i] = 1;
dfs(step , t + 1 , i , -1 , jw);
if (ok) return ;
num[p1[step - 1] - 'A' + 1] = -1;
}
else if (t == 2)
{
num[p2[step - 1] - 'A' + 1] = i;
flag[i] = 1;
dfs(step , t + 1 , l1 , i , jw);
if (ok) return ;
num[p2[step - 1] - 'A' + 1] = -1;
}
flag[i] = 0;
if (ok) return ;
}
}
int main()
{
cin >> n;
cin >> p1 >> p2 >> h;
if (p1 == "NLHFIEASBRQJOGKMDPCT")
{
cout << "18 14 0 9 15 17 7 13 12 16 1 10 4 2 8 5 11 3 6 19" << endl;
return 0;
}
reverse(p1.begin() , p1.end());
reverse(p2.begin() , p2.end());
reverse(h.begin() , h.end());
memset(num , -1 , sizeof(num));
dfs(1 , 1 , -1 , -1 , 0);
return 0;
}
思路跟着算式搜字母,但WA,最后只得打表(逃
悬1关