1.正确答案

【题目描述】

小H与小Y刚刚参加完UOIP外卡组的初赛,就迫不及待的跑出考场对答案。

“吔,我的答案和你都不一样!”,小Y说道,”我们去找神犇们问答案吧”。

外卡组试卷中共有m道判断题,小H与小Y一共从其他n个神犇那问了答案。之后又从小G那里得知,这n个神犇中有p个考了满分,q个考了零分,其他神犇不为满分或零分。这可让小Y与小H犯了难。你能帮助他们还原出标准答案吗?如有多解则输出字典序最小的那个。无解输出-1。

【输入格式】

第一行四个整数n, m, p, q,意义如上描述。

接下来n行,每一行m个字符’N’或’Y’,表示这题这个神犇的答案。

【输出格式】

仅一行,一个长度为m的字符串或是-1。

【样例输入】

2 2 2 0

YY

YY

【样例输出】

YY

【数据范围】

30% : n <= 100.

60% : n <= 5000 , m <= 100.

100% : 1 <= n <= 30000 , 1 <= m <= 500.  0 <= p , q 且 p + q <= n.

题解是这样说的:

30%:  O(n ^ 2 * m)暴力判断。

100%: 很显然答案的可能性最多只有n种,所以我们将所有人的答案按字典序排序后枚举     将每个人的答案作为正确答案来进行判断。由于是判断题,若当前人的答案为正确答      案则零分者的答案也就确定了,那么只需统计出这两种答案的人数判断是否满足题意      即可。这一步使用字符串哈希即可解决。

代码如下 :

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <cmath>
  6. using namespace std;
  7.  
  8. const int N = 3e4 + , M = 5e2 + , sed = , SED = , mod = , MOD = ;
  9. int n, m, p, q, ans, hash[N], HASH[N];
  10. int top, info[mod], nxt[N * ], fet[N * ], cnt[N * ];
  11. struct node {
  12. char s[M];
  13. inline bool operator < (const node &b) const {
  14. return strcmp(s, b.s) < ;
  15. }
  16. } a[N];
  17.  
  18. inline void Insert(const int &x, const int &y) {
  19. for (int k = info[x]; k; k = nxt[k])
  20. if (fet[k] == y) {
  21. ++cnt[k]; return ;
  22. }
  23. nxt[++top] = info[x]; info[x] = top;
  24. fet[top] = y; cnt[top] = ;
  25. return ;
  26. }
  27.  
  28. inline int Query(const int &x, const int &y) {
  29. for (int k = info[x]; k; k = nxt[k])
  30. if (fet[k] == y) return cnt[k];
  31. return ;
  32. }
  33.  
  34. inline void Solve1() {
  35. int tmp, TMP; ans = -;
  36. for (int i = ; i < n; ++i) {
  37. tmp = TMP = ;
  38. for (int j = ; j < m; ++j) {
  39. tmp = (tmp * sed + (a[i].s[j] == 'N')) % mod;
  40. TMP = (TMP * SED + (a[i].s[j] == 'N')) % MOD;
  41. }
  42. hash[i] = tmp, HASH[i] = TMP;
  43. Insert(tmp, TMP);
  44. }
  45. for (int i = ; i < n; ++i)
  46. if (Query(hash[i], HASH[i]) == p) {
  47. tmp = TMP = ;
  48. for (int j = ; j < m; ++j) {
  49. tmp = (tmp * sed + (a[i].s[j] == 'Y')) % mod;
  50. TMP = (TMP * SED + (a[i].s[j] == 'Y')) % MOD;
  51. }
  52. if (Query(tmp, TMP) == q) {
  53. ans = i; break;
  54. }
  55. }
  56. if (ans != -) printf("%s\n", a[ans].s);
  57. else puts("-1");
  58. return ;
  59. }
  60.  
  61. char cur[M];
  62. inline void Solve2() {
  63. int tmp, TMP; ans = -;
  64. for (int i = ; i < n; ++i) {
  65. tmp = TMP = ;
  66. for (int j = ; j < m; ++j) {
  67. tmp = (tmp * sed + (a[i].s[j] == 'N')) % mod;
  68. TMP = (TMP * SED + (a[i].s[j] == 'N')) % MOD;
  69. }
  70. hash[i] = tmp, HASH[i] = TMP;
  71. Insert(tmp, TMP);
  72. }
  73. for (int i = n - ; i >= ; --i)
  74. if (Query(hash[i], HASH[i]) == q) {
  75. tmp = TMP = ;
  76. for (int j = ; j < m; ++j) {
  77. tmp = (tmp * sed + (a[i].s[j] == 'Y')) % mod;
  78. TMP = (TMP * SED + (a[i].s[j] == 'Y')) % MOD;
  79. }
  80. if (Query(tmp, TMP) == p) {
  81. ans = i; break;
  82. }
  83. }
  84. if (ans != -) {
  85. for (int i = ; i < m; ++i)
  86. cur[i] = a[ans].s[i] == 'N' ? 'Y' : 'N';
  87. printf("%s\n", cur);
  88. }
  89. else puts("-1");
  90. return ;
  91. }
  92.  
  93. void Solve3() {
  94. int tmp, TMP;
  95. for (int i = ; i < n; ++i) {
  96. tmp = TMP = ;
  97. for (int j = ; j < m; ++j) {
  98. tmp = (tmp * sed + (a[i].s[j] == 'N')) % mod;
  99. TMP = (TMP * SED + (a[i].s[j] == 'N')) % MOD;
  100. }
  101. Insert(tmp, TMP);
  102. tmp = TMP = ;
  103. for (int j = ; j < m; ++j) {
  104. tmp = (tmp * sed + (a[i].s[j] == 'Y')) % mod;
  105. TMP = (TMP * SED + (a[i].s[j] == 'Y')) % MOD;
  106. }
  107. Insert(tmp, TMP);
  108. }
  109. bool flag = true;
  110. for (int i = ; i < m; ++i) cur[i] = 'N';
  111. do {
  112. tmp = TMP = ;
  113. for (int j = ; j < m; ++j) {
  114. tmp = (tmp * sed + (cur[j] == 'N')) % mod;
  115. TMP = (TMP * SED + (cur[j] == 'N')) % MOD;
  116. }
  117. if (Query(tmp, TMP) == ) {
  118. flag = true; break;
  119. }
  120. flag = false;
  121. for (int j = m - ; j >= ; --j)
  122. if (cur[j] == 'Y') cur[j] = 'N';
  123. else {
  124. cur[j] = 'Y'; flag = true; break;
  125. }
  126. } while (flag);
  127. if (flag) printf("%s\n", cur);
  128. else puts("-1");
  129. return ;
  130. }
  131.  
  132. int main() {
  133. freopen("answer.in", "r", stdin);
  134. freopen("answer.out", "w", stdout);
  135. scanf("%d%d%d%d", &n, &m, &p, &q);
  136. for (int i = ; i < n; ++i) scanf("%s", a[i].s);
  137. sort(a, a + n);
  138. if (p) Solve1();
  139. else if (q) Solve2();
  140. else Solve3();
  141. fclose(stdin); fclose(stdout);
  142. return ;
  143. }

2016.11.14测试 长乐一中2014NOIP复赛模拟题 第一题。的更多相关文章

  1. NOIP2010-普及组复赛模拟试题-第一题-手机

    题目背景 Background 现在手机使用越来越广泛了  题目描述 Description 一般的手机的键盘是这样的:   要按出英文字母就必须要按数字键多下.例如要按出 x 就得按 9 两下,第一 ...

  2. NOIP2011-普及组复赛模拟试题-第一题-NBA总冠军

    题目背景 Background 一年两度的期末考要到来了!!  题目描述 Description   又要到考试了,Ljw决定放松一下,就打开电视,看见了篮球赛,他立即想到了每年的NBA总冠军队伍.由 ...

  3. nginx学习记录/2016.11.14

    nginx(engine X)是一个高性能的web服务器和反向代理服务器以及电子邮件代理服务器 由俄罗斯的程序设计师Igor Sysoev所开发 nginx+tomcat实现负载均衡 参考地址:htt ...

  4. 2016.11.14 MIT challenge之课程总览

    Degree Chartshttp://catalog.mit.edu/degree-charts/computer-science-engineering-course-6-3/ MIT Chall ...

  5. noip2003复赛普及组第一题——乒乓球

    /*======================================================================= 题一.乒乓球(Table.pas) [问题背景]国际 ...

  6. NOIP2010-普及组复赛模拟试题-第二题-数字积木

    题目描述 Description 小明有一款新式积木,每个积木上都有一个数,一天小明突发奇想,要是把所有的积木排成一排,所形成的数目最大是多少呢?你的任务就是读入 n 个数字积木,求出所能形成的最大数 ...

  7. NOIP2011-普及组复赛模拟试题-第二题-买票

    题目背景 Background Ztc真的遇上黄牛了...  题目描述 Description   周末Ztc想去剧场看演出,但是他没有票.这时,救世主Wzj出现了,他慷慨地愿意卖给Ztc一些票.   ...

  8. NOIP2008复赛 提高组 第一题

    描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设maxn是单词中出现次数最多的 ...

  9. 全国信息学奥林匹克联赛 ( NOIP2014) 复赛 模拟题 Day1 长乐一中

    题目名称 正确答案  序列问题 长途旅行 英文名称 answer sequence travel 输入文件名 answer.in sequence.in travel.in 输出文件名 answer. ...

随机推荐

  1. Mac wifi已打开但尚未连接到网络

    把网络偏好设置  里面的询问新网络 关闭了   然后  重启电脑  试一下  应该就可以了

  2. DOS 下 mysql 导入.SQL

  3. PHPMailer不能发送邮件

    PHPMailer不能连接SMTP服务器,和修改SMTP大小写没有关系 (2011-10-22 12:17:35) 转载▼ 标签: php phpmailer 杂谈 分类: 默认分类 PHPmaile ...

  4. Mac下修改Hosts文件工具——Gas Mask

    这段时间在做公司APP的项目,看到公司开发IOS的同事和我这边联调程序时,经常需要手动修改hosts文件,比较麻烦. 在公司忙,没有来及找,给同事推荐了我当时知道的一个切换hosts文件的工具:sma ...

  5. 转:SVN常见问题与解决方法

    今天发现一个SVN很奇葩的问题.原来SVN提交的时候也是识别提交路径的大小写的... 发现网上有篇博客总结的挺好的.转载下来,转载出路:http://blog.csdn.net/shinn613/ar ...

  6. LCS(Longest Common Subsequence 最长公共子序列)

    最长公共子序列 英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已 ...

  7. 虚拟机中MySQL连接问题:Lost connection to MySQL server at 'reading initial communication packet, system error: 0 以及 host is not allowed to connect mysql

    环境:在VirtualBox中安装了Ubuntu虚拟机,网络使用了NAT模式,开启了端口转发. 局域网内其他计算机访问虚拟机中的MySQL Server出现两个问题: Lost connection ...

  8. SVN安装使用小结

    SVN在实际的项目开发中有很广泛的用途.一开始接触SVN(Subversion),思路并不清楚,现在总算理清了. 声明:本文并不是系统地对SVN做介绍,而是笔者的使用总结,个人认为的一些要点,可能对初 ...

  9. 【英文版本】Android开源项目分类汇总

    Action Bars ActionBarSherlock Extended ActionBar FadingActionBar GlassActionBar v7 appcompat library ...

  10. PlateSpin 完全复制由于LVM没有可用空闲空间导致失败

    使用PlateSpin复制居然会由于LVM的卷组VG没有空闲可用的空间(available free space in the LVM volume group)创建快照而导致失败,特此记录一下:免得 ...