【考前模拟】正确答案

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.

T1:

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

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

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;

const int N = 3e4 + 2, M = 5e2 + 2, sed = 31, SED = 131, mod = 70177, MOD = 92311;
int n, m, p, q, ans, hash[N], HASH[N];
int top, info[mod], nxt[N * 2], fet[N * 2], cnt[N * 2];
struct node {
    char s[M];
    inline bool operator < (const node &b) const {
        return strcmp(s, b.s) < 0;
    }
} a[N];

inline void Insert(const int &x, const int &y) {
    for (int k = info[x]; k; k = nxt[k])
        if (fet[k] == y) {
            ++cnt[k]; return ;
        }
    nxt[++top] = info[x]; info[x] = top;
    fet[top] = y; cnt[top] = 1;
    return ;
}

inline int Query(const int &x, const int &y) {
    for (int k = info[x]; k; k = nxt[k])
        if (fet[k] == y) return cnt[k];
    return 0;
}

inline void Solve1() {
    int tmp, TMP; ans = -1;
    for (int i = 0; i < n; ++i) {
        tmp = TMP = 0;
        for (int j = 0; j < m; ++j) {
            tmp = (tmp * sed + (a[i].s[j] == ‘N‘)) % mod;
            TMP = (TMP * SED + (a[i].s[j] == ‘N‘)) % MOD;
        }
        hash[i] = tmp, HASH[i] = TMP;
        Insert(tmp, TMP);
    }
    for (int i = 0; i < n; ++i)
        if (Query(hash[i], HASH[i]) == p) {
            tmp = TMP = 0;
            for (int j = 0; j < m; ++j) {
                tmp = (tmp * sed + (a[i].s[j] == ‘Y‘)) % mod;
                TMP = (TMP * SED + (a[i].s[j] == ‘Y‘)) % MOD;
            }
            if (Query(tmp, TMP) == q) {
                ans = i; break;
            }
        }
    if (ans != -1) printf("%s\n", a[ans].s);
    else     puts("-1");
    return ;
}

char cur[M];
inline void Solve2() {
    int tmp, TMP; ans = -1;
    for (int i = 0; i < n; ++i) {
        tmp = TMP = 0;
        for (int j = 0; j < m; ++j) {
            tmp = (tmp * sed + (a[i].s[j] == ‘N‘)) % mod;
            TMP = (TMP * SED + (a[i].s[j] == ‘N‘)) % MOD;
        }
        hash[i] = tmp, HASH[i] = TMP;
        Insert(tmp, TMP);
    }
    for (int i = n - 1; i >= 0; --i)
        if (Query(hash[i], HASH[i]) == q) {
            tmp = TMP = 0;
            for (int j = 0; j < m; ++j) {
                tmp = (tmp * sed + (a[i].s[j] == ‘Y‘)) % mod;
                TMP = (TMP * SED + (a[i].s[j] == ‘Y‘)) % MOD;
            }
            if (Query(tmp, TMP) == p) {
                ans = i; break;
            }
        }
    if (ans != -1) {
        for (int i = 0; i < m; ++i)
            cur[i] = a[ans].s[i] == ‘N‘ ? ‘Y‘ : ‘N‘;
        printf("%s\n", cur);
    }
    else     puts("-1");
    return ;
}

void Solve3() {
    int tmp, TMP;
    for (int i = 0; i < n; ++i) {
        tmp = TMP = 0;
        for (int j = 0; j < m; ++j) {
            tmp = (tmp * sed + (a[i].s[j] == ‘N‘)) % mod;
            TMP = (TMP * SED + (a[i].s[j] == ‘N‘)) % MOD;
        }
        Insert(tmp, TMP);
        tmp = TMP = 0;
        for (int j = 0; j < m; ++j) {
            tmp = (tmp * sed + (a[i].s[j] == ‘Y‘)) % mod;
            TMP = (TMP * SED + (a[i].s[j] == ‘Y‘)) % MOD;
        }
        Insert(tmp, TMP);
    }
    bool flag = true;
    for (int i = 0; i < m; ++i) cur[i] = ‘N‘;
    do {
        tmp = TMP = 0;
        for (int j = 0; j < m; ++j) {
            tmp = (tmp * sed + (cur[j] == ‘N‘)) % mod;
            TMP = (TMP * SED + (cur[j] == ‘N‘)) % MOD;
        }
        if (Query(tmp, TMP) == 0) {
            flag = true; break;
        }
        flag = false;
        for (int j = m - 1; j >= 0; --j)
            if (cur[j] == ‘Y‘) cur[j] = ‘N‘;
            else {
                cur[j] = ‘Y‘; flag = true; break;
            }
    } while (flag);
    if (flag) printf("%s\n", cur);
    else     puts("-1");
    return ;
}

int main() {
    freopen("answer.in", "r", stdin);
    freopen("answer.out", "w", stdout);
    scanf("%d%d%d%d", &n, &m, &p, &q);
    for (int i = 0; i < n; ++i) scanf("%s", a[i].s);
    sort(a, a + n);
    if (p) Solve1();
    else if (q) Solve2();
    else     Solve3();
    fclose(stdin); fclose(stdout);
    return 0;
}
时间: 2024-08-28 08:37:19

【考前模拟】正确答案的相关文章

华为网络技术大赛模拟题答案详解

华为网络技术大赛模拟题答案详解 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51354514 一.判断题 (1)VLSM的作用是:在有类的IP地址基础上,从主机位部分划分出相应的位数做为网络位.但是在路由器上部署时,需要路由协议的支持. [解释]对,VLSM=Variable Length Subnet Mask,可变长子网掩码 (2)有效的沟通是任何组织和任何项目的基础,项目经理可以花90%或者更多的时间在沟通这方

中国大学MOOC 哈工大数据库系统 第8讲模拟练习题答案

完整 中国大学MOOC 哈工大数据库系统 第8讲模拟练习题答案.pdf, 点我下载,进入下载页面点击普通下载 SQL语言的GRANT和REVOKE语句主要是用来维护数据库的_________. A.安全性 B.完整性 C.可靠性 D.一致性 正确答案:A你选对了 2安全性控制的防范对象是_________,防止他们对数据库数据的存取. A.非法非授权用户 B.不符合语义的数据 C.不正确的数据 D.不符合约束的数据 正确答案:A你选对了 原文地址:https://www.cnblogs.com/

3.5星|《是谁出的题这么难,到处都是正确答案》:?麦肯锡的经历,文艺妈妈的笔,温馨的父母与丈夫

作者1978年生人,做过麦肯锡的商业分析,在亚马逊中国工作过,后来先后加入过两个创业公司.个人离婚后3年遇到第二任丈夫,父母是上海知青,在江西插队11年,1977年回上海. 主要内容是两类:1:麦肯锡工作经验:2:个人生活回忆. 麦肯锡的工作经验,说的是一些大原则,比如如何分解复杂问题,比如一定要把问题定义清楚.这些内容虽然也是管理学常识,但是也是比较少见的来自亲历者的概括总结.挂名麦肯锡的书,大部分都不好,包括大前研一的书,相较而言本书讲麦肯锡的部分相当不错. 没怎么提作者在亚马逊中国和后面两

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

原文: http://www.wfuyu.com/php/22254.html 未做测试 ! 最近学习了下java类加载相干的知识.然后看到网上有1道面试题是 能不能自己写个类叫java.lang.System? 网上提供的答案:通常不可以,但可以采取另类方法到达这个需求.所谓的另类方法指自己写个类加载器来加载java.lang.System到达目的. 首先表明下我的观点.上述答案完全是误导读者,是不正确的答案.我就疑惑了网上怎样把这类完全不正确的搜索结果排在前面,而且几近搜到的都是这类不正确的

【NOIP考前模拟赛】纯数学方法推导——旅行者问题

一.写在前面 这题似乎是一道原创题目(不是博主原创),所以并不能在任何OJ上评测,博主在网盘上上传了数据(网盘地址:http://pan.baidu.com/s/1mibdMXi),诸位看官需者自取.另外博主使用此题并没有获得出题人授权,如果出题人看到这篇blog并认为在下侵犯了您的权利,请用站内消息与在下联系,在下会立即删除这篇blog,给您带来的困扰之处敬请谅解. 博主上传这道题主要是因为这题牵扯许多数学运算,推导过程比较复杂,但是却没有用到任何算法或者数学定理,可以说这是一道想法题的典范.

正确答案(answer)

小H与小Y刚刚参加完UOIP外卡组的初赛,就迫不及待的跑出考场对答案.“吔,我的答案和你都不一样!”,小Y说道,”我们去找神犇们问答案吧”.外卡组试卷中共有m道判断题,小H与小Y一共从其他n个神犇那问了答案.之后又从小G那里得知,这n个神犇中有p个考了满分,q个考了零分,其他神犇不为满分或零分.这可让小Y与小H犯了难.你能帮助他们还原出标准答案吗?如有多解则输出字典序最小的那个.无解输出-1. 输入格式: 第一行四个整数n, m, p, q,意义如上描述.接下来n行,每一行m个字符’N’或’Y’

2017.11.8 Noip2017 考前模拟赛

----------------------------------T1---------------------------------- ——>足球联赛 题目描述 巴蜀中学新一季的足球联赛开幕了. 足球联赛有 n 只球队参赛,每赛季,每只球队要与其他球队各赛两场,主客各一场,赢一场得 3 分,输一场不得分,平局两只队伍各得一分. 英勇无畏的小鸿是机房的主力前锋, 她总能在关键时刻踢出一些匪夷所思的妙球. 但是很可惜,她过早的燃烧完了她的职业生涯,不过作为一个能够 Burning 的 girl

sql基础题目测试及正确答案

在网上做了一套基本的sql题目,以下是我的写的答案,适合基础人员练练 --创建测试数据 use test create table Student(S# varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10)) insert into Student values('01' , N'赵雷' , '1990-01-01' , N'男') insert into Student values('02' , N'钱电' , '199

2019合工大共创五套卷(数一数二数三)模拟卷一+答案PDF

资源链接:https://pan.baidu.com/s/1SVQJDfXmVt6u0xJhFPgC3Q合工大共创考研数学模拟卷,冲刺复习经典必备.数学1和3都是每年五套题,数学2每年只有三套题.现更新数一数二数三的模拟卷一,分享给大家!如下: 原文地址:http://blog.51cto.com/14093933/2325032