uva 1262 Password 字典序第k个

时间:2021-11-27 01:20:57
  1. 第k个可以利用枚举,枚举到第k个。
  2. 利用一个vis数组在相应的字母位置上标记来看是否有相同元素。
#include<cstdio>
#include<iostream>
#include<sstream>
#include<cstdlib>
#include<cmath>
#include<cctype>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<ctime>
#include<vector>
#include<fstream>
#include<list>
using namespace std;

#define ms(s) memset(s,0,sizeof(s))
typedef unsigned long long ULL;
typedef long long LL;

const int INF = 0x3fffffff;

int t,k;
char p[2][6][7];
char ans[7];
int cnt;
bool vis[2][5][26];

bool dfs(int deep){
if(deep == 5){
cnt++;
if(cnt == k){
ans[deep] = '\0';
printf("%s\n",ans);
return true;
}
return false;
}

for(int j = 0; j < 26; ++j){
if(vis[0][deep][j] && vis[1][deep][j]){
ans[deep] = j+'A';
if(dfs(deep+1))
return true;
}
}

return false;
}

int main(){
freopen("F:\\input.txt","r",stdin);
freopen("F:\\output.txt","w",stdout);
// ios::sync_with_stdio(false);


scanf("%d",&t);

while(t--){
scanf("%d",&k);
getchar();
for(int i = 0; i < 2; ++i){
for(int j = 0; j < 6; ++j){
scanf("%s",p[i][j]);
}
}

ms(vis);
for(int i =0; i < 2; ++i){
for(int j = 0; j < 5; ++j){
for(int k = 0; k < 6; ++k)
vis[i][j][p[i][k][j]-'A'] = true;
}
}

cnt = 0;
if(!dfs(0))
printf("NO\n");
}

return 0;
}