算是一个模拟吧
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>
#include<cctype>
#include<queue>
#include<set>
#include<vector>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=10;
const int R=6;
const int C=5;
vector<char> key[MAXN];
bool vis[30];
int k,maxn;
int cnt[MAXN];
char s1[MAXN][MAXN],s2[MAXN][MAXN];
void init()
{
for(int j=0;j<C;j++)
{
memset(vis,0,sizeof(vis));
for(int i=0;i<R;i++)
{
if(vis[s1[i][j]-'A']) continue;
bool flag=false;
for(int v=0;v<R;v++)
{
if(s1[i][j]==s2[v][j])
{
flag=true;
break;
}
}
if(flag)
{
vis[s1[i][j]-'A']=true;
key[j].push_back(s1[i][j]);
}
}
}
for(int i=0;i<C;i++)
{
sort(key[i].begin(),key[i].end());
}
cnt[C-1]=1;
for(int i=C-2;i>=0;i--)
{
cnt[i]=cnt[i+1]*key[i+1].size();
}
maxn=cnt[0]*key[0].size();
}
void solve(int k,int idx)
{
int i=0;
if(idx==C) return;
while(k>cnt[idx])
{
i++;
k-=cnt[idx];
}
printf("%c",key[idx][i]);
solve(k,idx+1);
}
int main()
{
//freopen("data.out","w",stdout);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&k);
for(int i=0;i<C;i++)
{
key[i].clear();
}
for(int i=0;i<R;i++)
{
scanf("%s",s1[i]);
}
for(int i=0;i<R;i++)
{
scanf("%s",s2[i]);
}
init();
//printf("maxn=%d\n",maxn);
if(k>maxn)
{
printf("NO\n");
continue;
}
solve(k,0);
printf("\n");
}
return 0;
}