题目链接

紫书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. StackBlur.js

    StackBlur.js 是 Mario Klingemann 创建的一个快速的.接近高斯模糊的效果库. 更多信息: http://incubator.quasimondo.com/processin ...

  2. transition的局限

    transition的优点在于简单易用,但是它有几个很大的局限. (1)transition需要事件触发,所以没法在网页加载时自动发生. (2)transition是一次性的,不能重复发生,除非一再触 ...

  3. jquery.Deferred promise解决异步回调

    我们先来看一下编写AJAX编码经常遇到的几个问题: 1.由于AJAX是异步的,所有依赖AJAX返回结果的代码必需写在AJAX回调函数中.这就不可避免地形成了嵌套,ajax等异步操作越多,嵌套层次就会越 ...

  4. 给vps设置ssh供爬墙使用

    在服务器上建一个 username : 添加用户:useradd -s /bin/false username,将用户的shell设置成/bin/false.这样用户就无法与系统进行交互. 设置密码: ...

  5. Studying-Swift :Day01

    学习地址:http://www.rm5u.com/    或    http://www.runoob.com/ 如果创建的是 OS X playground 需要引入 Cocoa;  如果我们想创建 ...

  6. C语言 数组类型与数组指针类型

    //数组类型与数组指针类型 #include<stdio.h> #include<stdlib.h> #include<string.h> void main(){ ...

  7. python 遗传算法精简版

    精简版遗传算法,算法中仅采用变异算子而没有使用交叉算子,但是进化依然很有效 from string import ascii_lowercase from random import choice, ...

  8. CSS 实现加载动画之一-菊花旋转

    最近打算整理几个动画样式,最常见的就是我们用到的加载动画.加载动画的效果处理的好,会给页面带来画龙点睛的作用,而使用户愿意去等待.而页面中最常用的做法是把动画做成gif格式,当做背景图或是img标签来 ...

  9. 记录毕业论文 LanguageTool 二次开发时用到的网站

    LanguageTool Development LanguageTool Supported Languages Share your knowledge about LT - LanguageTo ...

  10. C#基础之垃圾回收

    1.托管资源的回收 我们都知道C#托管资源的回收由GC全权负责控制,可是什么时候GC会回收垃圾呢?一般出现以下情况会回收垃圾:手动调用GC.Collect()强制回收:第0代对象内存已满:应用程序域被 ...