1
2 /* 解码 _________________________________________________________________________________
3
4 #include <iostream>
5 #include <map>
6 #include <cmath>
7 #include <vector>
8 #include <cstdio>
9 #include <string>
10 #include <cstring>
11 #include <algorithm>
12 using namespace std;
13 #define fir first
14 #define sec second
15 #define pb(x) push_back(x)
16 #define mem(A, X) memset(A, X, sizeof A)
17 #define REP(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i))
18 #define rep(i,l,u) for(int (i)=(int)(l);(i)>=(int)(u);--(i))
19 #define foreach(e,x) for(__typeof(x.begin()) e=x.begin();e!=x.end();++e)
20 typedef long long LL;
21 typedef unsigned long long ull;
22 typedef pair<long,long> pll;
23
24
25 LL T,n;
26 int k;
27 const int mod=1e9+7;
28 const int maxn=1e5+10;
29 char s[2][6][10],ans[10];
30 int cnt;
31 bool dfs(int col)
32 {
33 if(col==5)
34 {
35 if(++cnt==k)
36 {
37 ans[5]='\0';
38 printf("%s\n",ans);
39 return true;
40 }
41 else
42 return false;
43 }
44 else
45 {
46 bool vis[2][26];
47 mem(vis,false);
48
49 REP(i,0,1)
50 REP(j,0,5)
51 vis[i][ s[i][j][col]-'A' ]=true; //只处理当前列对应的可能位置,搜索时只处理当前层。
52
53 REP(j,0,25)
54 if(vis[0][j]==true && vis[1][j]==true)
55 {
56 ans[col]=j+'A';
57 if( dfs(col+1) ) return true;
58 }
59 }
60 return false;
61
62 }
63
64 int main()
65 {
66 freopen("in.txt","r",stdin);
67 //while(cin>>n)
68 while(scanf("%d",&T)!=EOF)
69 {
70 REP(kase,1,T)
71 {
72 scanf("%d",&k);
73 REP(i,0,1)
74 REP(j,0,5)
75 {
76 scanf("%s",&s[i][j]);
77 //printf("%s\n",s[i][j]);
78 }
79 cnt=0;
80 if(!dfs(0)) puts("NO");
81 }
82
83 }
84 return 0;
85 }
86
87 /*
88 note : 编码理论
89 本题运用的暴力方法,编写简单,
90 如果用直接构造性的编码,实现时要注意更多的细节。
91
92
93 debug :
94 optimize:
95 直接操纵输入的字符,减少中间的传递,简化过程。
96 二维的数组字母表,处理多个相似的对象时进行优化。
97 */