uva1262(排列计数的编码解码)
2016-09-27 23:39
323 查看
/* translation: 给出两个6行5列的矩阵,根据这两个矩阵可以推出来一个5位密码串,没一位上的字母在两个矩阵中相应的列中必须出现 求按字典序的第k个密码串是什么? solution: 排列计数的编码解码 如1,2,3,4的全排列,共有4!种,求第10个的排列是(从1计 起)? 先试首位是1,后234有3!=6种<10,说明首位1偏小,问题转换成 求2开头的第(10-6=4)个排列,而3!=6 >= 4,说明首位恰是2。 第二位先试1(1没用过),后面2!=2个<4,1偏小,换成3(2用过 了)为第二位,待求序号也再减去2!,剩下2了。而此时2!>=2,说明第二位恰好是3。第三位先试1,但后面1!<2,因此改用4。末位 则是1了。 这样得出,第10个排列是2-3-4-1。 note: date: 2016.9.27 */ #include <iostream> #include <cstdio> #include <vector> #include <cstring> #include <algorithm> using namespace std; const int maxn = 10; const int row = 6; const int col = 5; vector<char> c[maxn]; //c[i]代表第i列的所有的合法字母 char m1[maxn][maxn]; char m2[maxn][maxn]; char ans[maxn]; int n; int f[maxn]; //f[i]代表0~i列全部都确定下来后总共还有多少中排列 bool flag1[30], flag2[30]; void compute() { memset(f, 0, sizeof(f)); for(int i = 0; i < 5; i++) { f[i] = 1; for(int j = i + 1; j < 5; j++) { f[i] *= c[j].size(); } } } bool solve() { memset(ans, 0, sizeof(ans)); compute(); int tmp = 1; for(int i = 0; i < 5; i++) tmp *= (int)c[i].size(); if(tmp < n) return false; int res = n; for(int i = 0; i < 5; i++) { sort(c[i].begin(), c[i].end()); for(int j = 0; j < c[i].size(); j++) { if(f[i] < res) { res -= f[i]; } else { ans[i] = c[i][j]; break; } } } return true; } int main() { //freopen("in.txt", "r", stdin); int T; scanf("%d", &T); while(T--) { scanf("%d", &n); for(int i = 0; i < 6; i++) scanf("%s", m1[i]); for(int i = 0; i < 6; i++) scanf("%s", m2[i]); memset(flag1, 0, sizeof(flag1)); memset(flag2, 0, sizeof(flag2)); for(int i = 0; i <= maxn; i++) c[i].clear(); for(int i = 0; i < col; i++) { for(int j = 0; j < row; j++) { flag1[m1[j][i] - 'A'] = true; flag2[m2[j][i] - 'A'] = true; } for(int k = 0; k < 26; k++) if(flag1[k] && flag2[k]) c[i].push_back(k + 'A'); memset(flag1, 0, sizeof(flag1)); memset(flag2, 0, sizeof(flag2)); } //求出每一位上所有可能的字母存储在c中 if(solve()) printf("%s\n", ans); else printf("NO\n"); } return 0; }
相关文章推荐
- 康拓排列--全排列的解码与编码
- 1211: [HNOI2004]树的计数 (prufer编码,排列组合,质因数分解)
- 算法:计数,编码,解码
- leetcode[60]Permutation Sequence 以及 全排列的编码与解码——康托展开 (附完整代码)
- 编码与解码(数论中的计数问题) By ACReaper
- [SDOI 2016]排列计数
- NSString的一些常用的方法,包括编码和解码
- 类似"&# x6B22;"这类16进制网页编码的编码与解码方法
- MINA源码分析---base64编码和解码
- javascript url 编码(UTF-8) jsp 解码
- 4517: [Sdoi2016]排列计数
- Node.js高级编程:用Javascript构建可伸缩应用(4)2.4 核心API基础-使用Buffer处理,编码,解码二进制数据
- BZOJ4517 排列计数 [组合数][错排]
- Base64编码原理及编码、解码实现
- BEncoding的编码与解码
- Android 实时视频采集/编码/传输/解码/播放—方案调研
- Memo: 记的在传递值和取页面返回值的时候编码和解码
- JAVA 对 URL 进行 编码与解码
- 中文编解码,可用于存中文或者编码具体参数的作用,防止被知道
- java中以post方式提交,中文编码&解码问题