正确答案

题目描述

小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.

题解

这道题在我看来是需要特判的恶心细节题,据说是一道noip模拟赛的题目

看到这道题目最开始的思路,把所有的答案hash一下,并把它们取反(即Y变N,N变Y),在hash一下,然后把每个答案都当做满分答案来做,因为只有Y和N两种答案,知道满分答案就能知道0分答案,统计一下这两种答案的个数是否满足题目所给的p和q,这里我用的是multiset,可重集合,直接计算元素个数,时间复杂度\(O(logn+szie),size\)是所查找元素的个数.

但是这样直接交的话只有60+左右,因为我们并没有考虑满分答案等于0的情况,其实这也很简单,就把所有答案都当成0分答案来做,像上面一样,只是反了过来,加上这个特判80+左右

最后还需要特判一下p和q都等于0的情况,这时我们直接深搜即可,因为要求字典序最小,我们就先搜N再搜Y,遇到第一个可行解直接输出并退出程序

#include<bits/stdc++.h>
#define Min(a,b) (a)<(b)?(a):(b)
#define Max(a,b) (a)>(b)?(a):(b)
#define in(i) (i=read())
using namespace std;
int read() {
int ans=0,f=1; char i=getchar();
while(i<'0' || i>'9') {if(i=='-') f=-1; i=getchar();}
while(i>='0' && i<='9') {ans=(ans<<1)+(ans<<3)+i-'0'; i=getchar();}
return ans*f;
}
multiset<int>t;
int n,m,p,q;
int base=3,mod=1e9+7;
struct str {
int v;
char s[510];
}ans;
char s[30010][510],ac[30010];
int Hash[30010],Hash2[30010],len[30010];
void dfs(int len) {
if(len==m) {
int sum1=0,sum2=0;
for(int i=1;i<=m;i++) {
sum1=(sum1*base%mod+(ac[i]=='N'))%mod;
sum2=(sum2%base%mod+(ac[i]=='Y'))%mod;
}
if(!t.count(sum1) && !t.count(sum2)) {
for(int i=1;i<=m;i++) printf("%c",ac[i]);
puts(""),exit(0);
}
return;
}
ac[len+1]='N'; dfs(len+1);
ac[len+1]='Y'; dfs(len+1);
}
int main()
{
ans.v=0; in(n); in(m); in(p); in(q);
for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
for(int i=1;i<=n;i++) {
string po; len[i]=strlen(s[i]+1);
for(int j=1;j<=len[i];j++) {
Hash[i]=(Hash[i]*base%mod+(s[i][j]=='Y'))%mod;
po+=(s[i][j]=='Y'?'N':'Y');
Hash2[i]=(Hash2[i]*base%mod+(po[j-1]=='Y'))%mod;
}
}
if(!p && !q) {
for(int i=1;i<=n;i++) t.insert(Hash[i]),t.insert(Hash2[i]);
dfs(0); cout<<-1<<endl;
return 0;
}
else if(!p && q) {
for(int i=1;i<=n;i++) t.insert(Hash2[i]);
for(int i=1;i<=n;i++) {
if(!t.count(Hash[i]) && t.count(Hash2[i])==q) {
if(ans.v==0 || ans.v>Hash2[i]) {
for(int j=0;j<len[i];j++) ans.s[j]=(s[i][j+1]=='Y'?'N':'Y');
ans.v=Hash2[i];
}
}
}
if(ans.v!=0) cout<<ans.s<<endl;
else cout<<-1<<endl;
return 0;
}
else {
for(int i=1;i<=n;i++) t.insert(Hash[i]);
for(int i=1;i<=n;i++) {
if(t.count(Hash2[i])==q && t.count(Hash[i])==p) {
if(ans.v==0 || ans.v>Hash[i]) {
for(int j=0;j<len[i];j++) ans.s[j]=s[i][j+1];
ans.v=Hash[i];
}
}
}
if(ans.v!=0) cout<<ans.s<<endl;
else cout<<-1<<endl;
return 0;
}
}

博主自认为代码算比较短的了,我看网上其他的题解一个个分分钟一两百行上下啊

博主蒟蒻,随意转载.但必须附上原文链接

http://www.cnblogs.com/real-l/

正确答案 [Hash/枚举]的更多相关文章

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

    [题目描述]小 H 与小 Y 刚刚参加完 UOIP 外卡组的初赛,就迫不及待的跑出考场对答案."吔,我的答案和你都不一样!",小 Y 说道,"我们去找神犇们问答案吧&qu ...

  2. 巨坑npm run dev 报错 终于找到正确答案 Error: EPERM: operation not permitted, open '/data/public/build/css/add.p

    Windows10环境 npm run dev 报错  终于找到正确答案 Error: EPERM: operation not permitted, open '/data/public/build ...

  3. ios高效开发-正确的使用枚举(Enum)

    前言 Enum,也就是枚举,从C语言开始就有了,C++.Java.Objective-C.Swift这些语言,当然都有对应的枚举类型,功能可能有多有少,但是最核心的还是一个—规范的定义代码中的状态.选 ...

  4. java能不能自己写一个类叫java.lang.System/String正确答案

    原文: http://www.wfuyu.com/php/22254.html 未做测试 ! 最近学习了下java类加载相干的知识.然后看到网上有1道面试题是 能不能自己写个类叫java.lang.S ...

  5. JS不用通过其他转换两个小数加减得到正确答案

    之前写过一篇文章js比较两个属于float类型的小数,都需要通过某种函数转换下,太麻烦了,比如: 减法:10.2345-0.01=10.2245,这是正确的答案,但是当你做加法的时候就变了 加法:10 ...

  6. poj2456 二分逼近寻找正确答案

    Aggressive cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10078   Accepted: 4988 ...

  7. Wannafly模拟赛 A.矩阵(二分答案+hash)

    矩阵 时间限制:1秒 空间限制:131072K 题目描述 给出一个n * m的矩阵.让你从中发现一个最大的正方形.使得这样子的正方形在矩阵中出现了至少两次.输出最大正方形的边长. 输入描述: 第一行两 ...

  8. BZOJ1014[JSOI2008]火星人——非旋转treap+二分答案+hash

    题目描述 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 8 9 10 ...

  9. B1567 [JSOI2008]Blue Mary的战役地图 二分答案+hash

    一开始以为是dp,后来看了一下标签...二分答案?之前也想过,但是没往下想,然后之后的算法就顺理成章,先求出第一个地图的所有子矩阵的hash值,然后求第二个,在上一个地图例二分查找,然后就没了. 算法 ...

随机推荐

  1. 001---Python简介

    编程语言: 机器语言 最底层,更容易被计算机识别,执行速度最快 复杂,开发效率低 汇编语言 比较底层,执行速度较快 同样复杂 高级语言 编译型语言:先编译,后执行.生成独立的可执行文件.是计算机可以理 ...

  2. (数据科学学习手札13)K-medoids聚类算法原理简介&Python与R的实现

    前几篇我们较为详细地介绍了K-means聚类法的实现方法和具体实战,这种方法虽然快速高效,是大规模数据聚类分析中首选的方法,但是它也有一些短板,比如在数据集中有脏数据时,由于其对每一个类的准则函数为平 ...

  3. delphi 数据库中Connection与Query连接数量问题思考

    今天闲着没事,测试了一下Connection连接MSSQL,可以承受多少连接.    1.看看ADOConnection的连接数:写了一个代码,动态创建,测试了10000个连接,花了大约5~10分钟创 ...

  4. hive报错:Caused by: ERROR XBM0H: Directory /var/lib/hive/metastore/metastore_db cannot be created.

    在cdh集群中,删除之前的hive服务,然后将hive添加到其他节点,然后再通过hive客户端连接hive报错: Caused by: ERROR XJ041: Failed to create da ...

  5. 使用pyinstaller将Python打包为exe文件

    当我们完成一个Python项目或一个程序时,希望将Python的py文件打包成在Windows系统下直接可以运行的exe程序,那么pyInstaller就是一个很好的选择.pyInstaller可以将 ...

  6. 【性能调优】一次关于慢查询及FGC频繁的调优经历

    以下来分享一个关于MySQL数据库慢查询和FGC频繁的性能案例. 一.系统架构 一个简单的dubbo服务,服务提供者提供接口,并且提供接口的实现,提供方注册服务到Zookeeper注册中心,然后消费者 ...

  7. CSP201409-1:相邻数对

    引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...

  8. popen和system问题

    popen和system问题 1. 问题描述 C的代码里面去调用命令启动一个shell脚本,分别使用了下面两个途径. 其中一个是: func1(cmd) { popen(cmd,type); pclo ...

  9. Turtle模块,一个超精简但功能齐全的绘图包

    先上官方链接https://docs.python.org/3.3/library/turtle.html 再上一个GitHub上别人做的一个小程序,画小猪佩琦的,里面用到了大量常用的turtle接口 ...

  10. 浅谈c语言和c++中struct的区别

    今天做二叉树的时候,发现利用结构体有点乱,不知道怎么回事,我之前知道c语言中声明一个结构体变量时需要通过 struct 结构体名 变量名,而在c++中,可以不要struct,由于可以利用typedef ...