题目链接

紫书P323

题意:两个6*5的字母矩阵,两个矩阵每列相同的字母,每列取一个,求按照字典序第k小的序列

分析:

对于第一个样例来说,我们得到{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就是第一个集合中的第几个元素

求第二个集合的时候,k = k % 72 ...

还有一些处理的细节,在代码中

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
int k;
char G[][][]; //一个三维的数组存储两个矩阵
int vis[][],cnt[],he[]; //vis[i][j]表示第i个矩阵第j个字母是否访问,cnt是每一列的总数,he是后缀积
char Select[][],ans[]; //select[i][j]表示第i行第j个字母
int main()
{
int test;
scanf("%d", &test);
while(test--)
{
scanf("%d", &k);
for(int i = ; i < ; i++)
{
for(int j = ; j < ; j++)
scanf("%s", G[i][j]);
}
memset(cnt, , sizeof(cnt));
for(int i = ; i < ; i++) //找两个矩阵对应的列中相同的元素处理的很好,对每一列对两个矩阵一行一行的查找
{
memset(vis, , sizeof(vis));
for(int j = ; j < ; j++)
{
for(int m = ; m < ; m++)
vis[j][ G[j][m][i] - 'A' ] = ;
}
for(int j = ; j < ; j++)
{
if(vis[][j] && vis[][j]) //两个矩阵同一列都访问过了
Select[i][ ++cnt[i] ] = 'A' + j; //第i列第cnt[i]个放入这个字母
}
}
he[] = ;
for(int i = ; i >= ; i--)
{
he[i] = cnt[i] * he[i + ];
}
if(k > he[])
{
printf("NO\n");
continue;
}
k--; //因为考虑到k == 1的情况
for(int i = ; i < ; i++)
{
int t = k / he[i + ];
ans[i] = Select[i][t + ]; //对于每一个字母都是从1开始标号的,整除之后取下一个,就像k = 1时,每一列都得取第一个,对于最后一列的时候 t = 1,那就取第二个了,所以k--
k = k % he[i + ];
}
ans[] = '\0';
printf("%s\n", ans);
}
return ;
}

UVA1262Password(第K字典序)的更多相关文章

  1. UVa 1262 (第k字典序) Password

    题意: 给出两个6行5列的字母矩阵,一个密码满足:密码的第i个字母在两个字母矩阵的第i列均出现. 然后找出字典序为k的密码,如果不存在输出NO 分析: 我们先统计分别在每一列均在两个矩阵出现的字母,然 ...

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

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

  3. C++之路进阶——P2022

    P2022 有趣的数 让我们来考虑1到N的正整数集合.让我们把集合中的元素按照字典序排列,例如当N=11时,其顺序应该为:1,10,11,2,3,4,5,6,7,8,9. 定义K在N个数中的位置为Q( ...

  4. spoj PARTIT

    三维DP 第K字典序从左向右找 根据dp数组的值算出每一位该打印什么 代码: #include <cstdio> #include <cstring> using namesp ...

  5. SGU 159.Self-Replicating Numbers

    时间限制:0.5s 空间限制:6M 题意:         在b(2<b<36)进制中,找到所有长度为n(0<n<2000)的自守数k,满足k^2%b^n=k,字典序输出.   ...

  6. Minimum Transport Cost(floyd+二维数组记录路径)

    Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

  7. 「Algospot」龙曲线DRAGON

    一道考验思维的好题,顺便总结求第k大问题的常规思路: 传送门:$>here<$ 题意 给出初始串FX,每分形一次所有X替换为X+YF,所有Y替换为FX-Y.问$n$代字符串第$p$位起长度 ...

  8. [CodeForces332E]Binary Key

    Problem 题目给出一个加密前的字符串长度为p和加密后的字符串长度为s,让你求一个长度为K字典序最小的密钥. 密钥是循环的,第i位为1表示加密前的第i为是有用的否则是没用的. Solution 首 ...

  9. 字典树(Trie树) C++实现

    说明: 以下代码是个人按照自己的理解写的,可能有错误或者不太规范的地方,欢迎指出! 代码如下: //插入.删除.查询.遍历四种操作 //注意:四种操作的函数实现中,T都是指向上一个结点的指针,以此方便 ...

随机推荐

  1. 3110 PHP常见问题

    1.中文显示 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&g ...

  2. 如何在Web服务器80端口上开启SSH服务

    本文所讨论的网络端口复用并非指网络编程中采用SO_REUSEADDR选项的 Socket Bind 复用.它更像是一个带特定路由功能的端口转发工具,在应用层实现. 背景 笔者所处网络中防火墙只开放了一 ...

  3. react native 底部按钮切换

    在react   native  中底部按钮的切换  主要的是运用的是<TabBarNavigator/>这个组件,具体的代码实现如下: render() { return ( <T ...

  4. list to csv

    import csv # ============================== # list to csv # ============================== a = [1,2, ...

  5. 那些年我们写过的T-SQL(下篇)(转)

    原文:http://www.cnblogs.com/wanliwang01/p/TSQL_Base04.html   下篇的内容很多都会在工作中用到,尤其是可编程对象,那些年我们写过的存储过程,有木有 ...

  6. iOS 定位精度

    时间 2015-03-19 18:30:59  图灵社区  由于iOS不能直接控制到GPS,一般来说我们都会使用CLLocationManager来获取地理位置信息,我们会使用 manager.des ...

  7. [CareerCup] 9.5 Permutations 全排列

    9.5 Write a method to compute all permutations of a string. LeetCode上的原题,请参加我之前的博客Permutations 全排列和P ...

  8. windows2003 单网卡 搭建vpn ,windows 2008 R2 类似吧。网上转的,自己加了点经验总结

    先说说可能的坑,也就是我自己搭建的时候碰到的问题. 其实搭建起来很简单,我不知道我总结的对还是不对,但是按下面这样操作做绝对能搭好!因为我就是按这样搭起来的,但是我发现,好像pptp已经被墙了,我也不 ...

  9. jquery扩展函数详解(我的人生颠覆)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上次分析了jquery的源码 ...

  10. Object C学习笔记19-枚举

    一. 枚举类型 枚举类型是一个基本类型,不能再分为为任何其他的类型.在一般的编程语言中都有枚举(enum)这种数据结构类型.枚举类型主要用于将一个变量限定在特定的范围内.比如一周有七天,那么一周的值就 ...