题目链接

紫书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. wid是一个字符串 必须转化成整型

    wid是一个字符串 必须转化成整型

  2. Netty5-应答服务器

    需求: 服务端:接收客户端请求,返回当前系统时间 客户端:发起时间请求 服务端 package org.zln.netty.five.timer; import io.netty.bootstrap. ...

  3. Minimum Window Substring

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  4. Linux 网络编程一(TCP/IP协议)

    以前我们讲过进程间通信,通过进程间通信可以实现同一台计算机上不同的进程之间通信. 通过网络编程可以实现在网络中的各个计算机之间的通信. 进程能够使用套接字实现和其他进程或者其他计算机通信. 同样的套接 ...

  5. OAViewObject中clearCache(),reset(),setMaxFetchSize(-1)的使用

    今天在页面跳转之后,明明执行了查询,且查询语句正确的情况下,页面不显示数据,且点击SubmitButton包浏览器后退异常. 代码如下: OAViewObjectImpl vo=(OAViewObje ...

  6. java 十六进制颜色对照表

    我们在编程中常常用到十六进制颜色码.   下面是颜色码对照表-英文名称-十六进制-RGB:   英文代码      形像颜色       HEX格式         RGB格式 LightPink 浅 ...

  7. STM32的USB速度,终于确定了传输极限,为以后的产品设计提供了数据。

    是自定协议,用到一个bulk in ep1, 一个bulk out ep2 端点  用虚拟串口的优点显而易见,上位机的编写非常方便,就按照常规的串口功能编写就可以了,而速度确还是usb的速度  USB ...

  8. display:inline-block的坑

    一直用display:inline-block做某种导航栏还很爽,突然有一个柱状图的需求便也这么做了,于是成功被坑. 简简单单个需求,大致这样 只用几个li加上display:inline-block ...

  9. oracle-5-的升级步骤

    升级数据库的步骤 1.决定升级到那个版本 2.确定最近的数据已经备份(非常的重要) 3.安装软件升级包 4.升级方式启动数据库 5.执行必要的脚本 6.升级后的检查

  10. OC基础--成员变量的封装

    一.封装的作用: 1.重用 2.不必关心具体的实现 3.面向对象三大特征之一 4.具有安全性 二.OC中成员变量的命名规范以及注意事项 1.命名规范--.成员变量都以下划线“_”开头 1)为了跟get ...