解码,暴力。
恬不知耻地把暴力题解放了上来,因为k比较小,直接暴力找到字符串第k大就可以了。
编码解码就是根据组合数学公式算出来它到底在哪。
dfs返回bool就能使得找到字典序第k大字符串以后退出dfs,节省时间。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxl = 30; char s[3][maxl][maxl];
int ok[3][maxl][maxl];
int cnt[maxl],a[maxl][maxl];
int res,num,last;
int p[maxl]; bool dfs(int n) {
if(n==6) {
num++;
if(num==last) {
for(int i=1;i<=5;i++) printf("%c",p[i]+'A');
printf("\n");
return true;
}
return false;
}
for(int i=1;i<=cnt[n];i++) {
p[n]=a[n][i];
if(dfs(n+1)) return true;
}
return false;
} int main() {
int T;
scanf("%d",&T);
while(T--) {
scanf("%d",&last);
memset(ok,0,sizeof(ok));
memset(cnt,0,sizeof(cnt));
for(int k=1;k<=2;k++)
for(int i=1;i<=6;i++) {
scanf("%s",s[k][i]+1);
for(int j=1;j<=5;j++)
ok[k][j][s[k][i][j]-'A']=1;
}
for(int i=1;i<=5;i++)
for(int j=0;j<26;j++)
if(ok[1][i][j]&&ok[2][i][j])
a[i][++cnt[i]]=j;
res=1; num=0;
for(int i=1;i<=5;i++) res*=cnt[i];
if(res<last) printf("NO\n");
else dfs(1);
}
return 0;
}