题意:

给出两个6行5列的字母矩阵,一个密码满足:密码的第i个字母在两个字母矩阵的第i列均出现。

然后找出字典序为k的密码,如果不存在输出NO

分析:

我们先统计分别在每一列均在两个矩阵出现的字母,然后从小到大排好序。

对于第一个样例来说,我们得到ACDW、BOP、GMOX、AP、GSU

则一共有4×3×4×2×3=288种密码,我们先计算这个数列的后缀积:288、72、24、6、3、1

要确定第一个字母,如果1≤k≤72,则是A;如果73≤k≤144,则是C,以此类推。

确定第二个字母是类似的,用k%72+1与24去比较。

代码实现中,字典序是从0开始的。

 //#define DEBUG
#include <cstdio>
#include <cstring> char G[][][], ans[], select[][];
int vis[][], hehe[], cnt[]; int main()
{
//freopen("in.txt", "r", stdin); int T;
scanf("%d", &T);
hehe[] = ;
while(T--)
{
memset(cnt, , sizeof(cnt));
int k;
scanf("%d", &k);
k--; //字典序标号从0开始
for(int i = ; i < ; ++i)
for(int j = ; j < ; ++j)
scanf("%s", G[i][j]); for(int i = ; i < ; ++i)
{
memset(vis, , sizeof(vis));
for(int j = ; j < ; ++j)
for(int k = ; k < ; ++k)
vis[j][G[j][k][i]-'A'] = ;
for(int j = ; j < ; ++j)
if(vis[][j] && vis[][j])
select[i][cnt[i]++] = 'A' + j;
} #ifdef DEBUG
for(int i = ; i < ; ++i)
{
for(int j = ; j < select[i].size(); ++j)
printf("%c", select[i][j]);
puts("");
}
#endif // DEBUG for(int i = ; i >= ; --i)
hehe[i] = cnt[i] * hehe[i+];
if(k >= hehe[])
{
puts("NO");
continue;
}
for(int i = ; i < ; ++i)
{
int m = k / hehe[i+];
ans[i] = select[i][m];
k = k % hehe[i+];
}
ans[] = '\0'; printf("%s\n", ans);
} return ;
}

代码君一

解法二:

因为密码最多有65 = 7776种,所以可以按字典序从小到大枚举。

思维难度小,写起来更快更对。

 #include <cstdio>
#include <cstring> int k, cnt;
char G[][][], ans[]; bool dfs(int col)
{
if(col == )
{
if(++cnt == k)
{
ans[col] = '\0';
printf("%s\n", ans);
return true;
}
return false;
} bool vis[][];
memset(vis, false, sizeof(vis));
for(int i = ; i < ; ++i)
for(int j = ; j < ; ++j)
vis[i][G[i][j][col] - 'A'] = ;
for(int i = ; i < ; ++i)
if(vis[][i] && vis[][i])
{
ans[col] = i + 'A';
if(dfs(col+)) return true;
}
return false;
} int main()
{
//freopen("in.txt", "r", stdin);
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d", &k);
for(int i = ; i < ; ++i)
for(int j = ; j < ; ++j)
scanf("%s", G[i][j]); cnt = ;
if(!dfs()) puts("NO");
} return ;
}

代码君二

UVa 1262 (第k字典序) Password的更多相关文章

  1. 【暑假】[数学]UVa 1262 Password

    UVa 1262  Password 题目: Password   Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld ...

  2. UVA - 1262 数学

    UVA - 1262 题意: 有两个6*5 的大写字母组成的矩阵,需要找出满足条件的字典序第k小的密码:密码中每个字母在两个矩阵的对应的同一列中都出现过 代码: // 先处理出来每一列可以取的字母,例 ...

  3. UVA 1262 Password 暴力枚举

    Password Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA. Original ID:  ...

  4. UVa 1262 - Password(解码)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  5. UVA 1262 Password

    https://vjudge.net/problem/UVA-1262 字典序第k小 注意两点: 1. k-- 2.去重 #include<cstring> #include<cst ...

  6. UVA - 1262 Password(密码)(暴力枚举)

    题意:给两个6行5列的字母矩阵,找出满足如下条件的“密码”:密码中的每个字母在两个矩阵的对应列中均出现.给定k(1<=k<=7777),你的任务是找出字典序第k小的密码.如果不存在,输出N ...

  7. UVA1262Password(第K字典序)

    题目链接 紫书P323 题意:两个6*5的字母矩阵,两个矩阵每列相同的字母,每列取一个,求按照字典序第k小的序列 分析: 对于第一个样例来说,我们得到{ACDW}.{BOP}.{GMOX}.{AP}. ...

  8. HDOJ-6628(dfs+第k字典序最小差异序列)

    permutation 1 HDOJ-6628 这题使用的暴力深搜,在dfs里面直接从最小的差异开始枚举 注意这里的pre记录前一个数,并且最后答案需要减去排列中最小的数再加一 这里有一个技巧关于求第 ...

  9. 【每日一题】 UVA - 1599 Ideal Path 字典序最短路

    题解:给一个1e5个点2e5条边,每个边有一个值,让你输出一条从1到n边的路径使得:条数最短的前提下字典序最小. 题解:bfs一次找最短路(因为权值都是1,不用dijkstra),再bfs一次存一下路 ...

随机推荐

  1. silverlight 控件自定义样式 实现方法

    1:在app.xaml中加入需实现的样式,如: <Application.Resources> <Style x:Key="NodeStyle" TargetTy ...

  2. angular 服务

    在Angular里面,services作为单例对象在需要到的时候被创建,只有在应用生命周期结束的时候(关闭浏览器)才会被清除.而controllers在不需要的时候就会被销毁了.服务用于在控制器之间进 ...

  3. IDENTITY属性使用

    转自:http://www.cnblogs.com/seusoftware/p/3804333.html 一. 获取IDENTITY列值插入了数据,有时还需要获取刚才生成的序列值另作他用,返回给前端也 ...

  4. Deep Learning and Shallow Learning

    Deep Learning and Shallow Learning 由于 Deep Learning 现在如火如荼的势头,在各种领域逐渐占据 state-of-the-art 的地位,上个学期在一门 ...

  5. PHP的反射机制(转)

    介绍: PHP5添加了一项新的功能:Reflection.这个功能使得phper可以reverse-engineer class, interface,function,method and exte ...

  6. Web App之一

    JSP/HTML/CSS---------View(不包含任何的数据,只作为基本的layout) JS------------------------Data(update JSP/HTML)

  7. 如何有效地记录 Java SQL 日志?

    在常规项目的开发中可能最容易出问题的地方就在于对数据库的处理了,在大部分的环境下,我们对数据库的操作都是使用流行的框架,比如 Hibernate . MyBatis 等.由于各种原因,我们有时会想知道 ...

  8. POJ 3278Catch That Cow

    http://poj.org/problem?id=3278 大意是说牛在原地不动,他在某点去抓牛,他有两种方式可以走,第一种走一步,往前往后都可,第二种是走现在所在点的两倍的数目.只要能够刚好到达牛 ...

  9. C Primer Plus 第3章 数据和C 编程练习

    1. /* 整数上溢 */ #include <stdio.h> int main(void) { ; unsigned ; /* 无符号整数j像一个汽车里程指示表(形容的太好了,可参考& ...

  10. Android 加载时在actionBar右上角添加一个加载图标

    ①首先要在Activity的  setContentView()方法前调用requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); // ...