UVa 1262 - Password(组合数)

给出两个6*5矩阵,有一个5位的密码,密码的第i位必须在两个矩阵的第i列都出现过,问输出字典序第k大的满足条件的密码,无解输出“NO”。

预处理出每一位满足条件的字母,然后计算后几位密码可行的种数。对k进行判断后输出,具体细节见代码。

#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
char s[2][7][6];
bool has[2][6][27];
vector<char> ok[5];
int main(){
    int t;scanf("%d",&t);
    while(t--){
        fill(ok,ok+5,vector<char>());
        memset(has,0,sizeof has);
        int k;scanf("%d",&k);
        for(int i=0;i<2;++i)
            for(int j=0;j<6;++j)
                scanf("%s",s[i][j]);
        for(int i=0;i<5;++i)
            for(int j=0;j<6;++j){
                has[0][i][s[0][j][i]-‘A‘]=true;
                has[1][i][s[1][j][i]-‘A‘]=true;
            }
        for(int i=0;i<5;++i)
            for(int j=0;j<26;++j)
                if(has[0][i][j]&&has[1][i][j])
                    ok[i].push_back(j+‘A‘);
        int a[6];a[5]=1;
        for(int i=4;i>=0;--i) a[i]=a[i+1]*int(ok[i].size());
        if(k>a[0]){puts("NO");continue;}
        --k;
        for(int i=0;i<5;++i){
            putchar(ok[i][k/a[i+1]]);
            k%=a[i+1];
        }
        putchar(‘\n‘);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-07 15:30:25

UVa 1262 - Password(组合数)的相关文章

【暑假】[数学]UVa 1262 Password

UVa 1262  Password 题目: Password Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Shoulder-surfing is the behavior of intentionally and stealthily watching the screen of another person's electronic de

UVA 1262 Password 暴力枚举

Password Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA. Original ID: 1262 64-bit integer IO format: %lld      Java class name: Main Prev Submit Status Statistics Discuss Next [PDF Link] Shoulder-surfing is the behavior

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

题意:给两个6行5列的字母矩阵,找出满足如下条件的"密码":密码中的每个字母在两个矩阵的对应列中均出现.给定k(1<=k<=7777),你的任务是找出字典序第k小的密码.如果不存在,输出NO. 分析:因为k<=7777,直接按字典序从小到大的顺序递归一个一个的枚举. 注意:定义在dfs里的vis不能放在全局,否则会导致值的混用. #pragma comment(linker, "/STACK:102400000, 102400000") #incl

UVA 1262 Password

https://vjudge.net/problem/UVA-1262 字典序第k小 注意两点: 1. k-- 2.去重 #include<cstring> #include<cstdio> #include<set> #include<algorithm> using namespace std; char s[3][7][6]; int sum[6][6],ans[6],suc[7]; set<char>se[7]; int main() {

uva 1076 - Password Suspects(AC自动机+记忆化搜索)

题目链接:uva 1076 - Password Suspects 题目大意:有一个长度为n的密码,存在m个子串,问说有多少种字符串满足,如果满足个数不大于42,按照字典序输出. 解题思路:根据子串构建AC自动机,然后记忆化搜索,dp[i][u][s]表示第i个字符,在u节点,匹配s个子串. #include <cstdio> #include <cstring> #include <queue> #include <string> #include <

UVA 1076 - Password Suspects(AC自动机+DP)

UVA 1076 - Password Suspects 题目链接 题意:一个密码,给定m个已知子串,求这个密码最多有几种表示方式,如果小于42种,就输出这些密码 思路:先利用已有子串构造AC自动机,需要改造一下的地方是每个叶子结点为(1<<i),然后构造next数组,在状态图上进行dp,dp[i][j][k]表示在结点i,长度j,已有子串集合为k的种数,进行状态转移即可,最后判断一下答案是否不大于42,如果是再根据之前求出的dp状态去进行输出即可 代码: #include <cstdi

UVa 1262 (第k字典序) Password

题意: 给出两个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,以此类推. 确定第二个字母是类似的

Uva 7040 color(组合数)

题意:n个球有m种颜色可选,使用k种不同的颜色,求方案数: 思路:Cm[k]表示m中选k,方案数为Cm[k]*(k*(k-1)^(n-1)-sigma(p*(p-1)^(n-1))(1<=p<k)); #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MOD 1000000007 int t,n,m,k; long long ck[50001

UVA 902 Password Search (字符串)

Password Search Being able to send encoded messages during World War II was very important to the Allies. The messages were always sent after being encoded with a known password. Having a fixed password was of course insecure, thus there was a need t