16.1114 模拟考试T1
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.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=3e4+,M=5e2+,sed=,SED=,mod=,MOD=;
int n,m,p,q,ans,hash[N],HASH[N];
int top,info[mod],nxt[N*],fet[N*],cnt[N*];
struct node {
char s[M];
inline bool operator < (const node &b) const {
return strcmp(s, b.s) < ;
}
} a[N];
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]=;
return ;
}
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 ;
}
void solve1()
{
int tmp,TMP,ans=-;
for(int i=;i<n;i++){
tmp=TMP=;
for(int j=;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=;i<n;i++){
if(query(hash[i],HASH[i])==p){
tmp=TMP=;
for(int j=;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!=-) printf("%s",a[ans].s);
else printf("-1");
return;
}
char cur[M];
void solve2()
{
int tmp,TMP,ans=-;
for(int i=;i<n;i++){
tmp=TMP=;
for(int j=;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-;i>=;i--){
if(query(hash[i],HASH[i])==q){
tmp=TMP=;
for(int j=;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!=-){
for(int i=;i<m;++i)
cur[i]=a[ans].s[i]=='N'?'Y':'N';
printf("%s\n",cur);
}
else printf("-1");
return;
}
void solve3()
{
int tmp,TMP;
for(int i=;i<n;i++){
tmp=TMP=;
for(int j=;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=;
for(int j=;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=;i<m;i++) cur[i]='N';
do {
tmp=TMP=;
for(int j=;j<m;++j) {
tmp=(tmp*sed+(cur[j]=='N'))%mod;
TMP=(TMP*SED+(cur[j]=='N'))%MOD;
}
if(query(tmp,TMP)==){
flag=true;break;
}
flag=false;
for(int j=m-;j>=;--j)
if(cur[j]=='Y') cur[j]='N';
else{
cur[j]='Y';flag=true;break;
}
} while (flag);
if(flag) printf("%s\n",cur);
else printf("-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=;i<n;i++) scanf("%s",a[i].s);
sort(a,a+n);
if(p) solve1();
else {
if(q) solve2();//处理p==0 的情况
else solve3();// p\q都等于0
}
fclose(stdin); fclose(stdout); return ;
}
数据:见云盘 提取密码:hypu
16.1114 模拟考试T1的更多相关文章
- 16.1113 模拟考试T1
笔记[问题描述]给定一个长度为m的序列a,下标编号为1~m.序列的每个元素都是1~N的整数.定义序列的代价为累加(1->m-1 abs(ai+1-ai))你现在可以选择两个数x和y,并将序列?中 ...
- 16.1112 模拟考试 T1
加密[问题描述]有一种不讲道理的加密方法是: 在字符串的任意位置随机插入字符. 相应的,不讲道理的解密方法就是从字符串中恰好删去随机插入的那些字符.给定原文s和加密后的字符串t,求?有多少子串可以通过 ...
- 16.1113 模拟考试T2
测试题 #4 括号括号[问题描述]有一个长度为?的括号序列,以及?种不同的括号.序列的每个位置上是哪种括号是随机的,并且已知每个位置上出现每种左右括号的概率.求整个序列是一个合法的括号序列的概率.我们 ...
- 16.1113 模拟考试T3
城堡[问题描述]给定一张N个点M条边的无向连通图,每条边有边权.我们需要从M条边中选出N − 1条, 构成一棵树. 记原图中从 1 号点到每个节点的最短路径长度为?Di ,树中从 1 号点到每个节点的 ...
- 【2019.7.16 NOIP模拟赛 T1】洗牌(shuffle)(找环)
找环 考虑每次洗牌其实是一次置换的过程,而这样必然就会有循环出现. 因此我们直接通过枚举找出每一个循环,询问时只要找到环上对应的位置就可以了. 貌似比我比赛时被卡成\(30\)分的倍增简单多了? 代码 ...
- 10.16 NOIP模拟赛
目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...
- 驾照理论模拟考试系统Android源码下载
驾照理论模拟考试系统Android源码下载 <ignore_js_op> 9.png (55.77 KB, 下载次数: 0) <ignore_js_op> 10.png ...
- RHCE模拟考试
真实考试环境说明: 你考试所用的真实物理机器会使用普通账号自动登陆,登陆后,桌面会有两个虚拟主机图标,分别是system1和system2.所有的考试操作都是在system1和system2上完成.S ...
- 【2018.06.26NOIP模拟】T1纪念碑square 【线段树】*
[2018.06.26NOIP模拟]T1纪念碑square 题目描述 2034年,纪念中学决定修建校庆100周年纪念碑,作为杰出校友的你被找了过来,帮校方确定纪念碑的选址. 纪念中学的土地可以看作是一 ...
随机推荐
- Java数据结构和算法(五)--希尔排序和快速排序
在前面复习了三个简单排序Java数据结构和算法(三)--三大排序--冒泡.选择.插入排序,属于算法的基础,但是效率是偏低的,所以现在 学习高级排序 插入排序存在的问题: 插入排序在逻辑把数据分为两部分 ...
- Spring对注解(Annotation)处理【转】
1.从Spring2.0以后的版本中,spring也引入了基于注解(Annotation)方式的配置,注解(Annotation)是JDK1.5中引入的一个新特性,用于简化Bean的配置,某些场合可以 ...
- ubuntu 16.04 安装node.js 8.x
引自 https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-16-04#how-to-in ...
- js的正则表达式总结
1.8-20位数字 or 字母 or 特殊字符 var reg = /^[0-9a-zA-Z!@#$%^&*()_+-/.]{8,20}$/; 2.8-20位 数字+字母+特殊字符 //正则 ...
- shell脚本,录制和回放终端的小工具script。
action.log和time.log这两个配置文件被当做script命令的参数.这两个文件可以随便命名.这里用time.log和action.log.其中time.log用于存储时序信息,描述每一个 ...
- Spring根据XML配置文件 p名称空间注入属性(property后出现,简便但只针对基本数据类型管用,自定义集合等引用类型无效)
要生成对象并通过名称空间注入属性的类 代码如下: package com.swift; public class User { private String userName; public void ...
- mac拷贝原版和权限修复的命令行工具
建议直接从安装盘中用命令复制,因为上传的kext权限会变,导致签名失败. 假定安装盘盘符是install_osx: sudo cp -R /Volumes/install_osx/S*/L*/E*/A ...
- centos7内核优化
#sysctl -p 参数: net.ipv6.conf.all.disable_ipv6 = 1net.ipv6.conf.default.disable_ipv6 = 1net.ipv4.icmp ...
- python爬虫(爬取视频)
爬虫爬视频 爬取步骤 第一步:获取视频所在的网页 第二步:F12中找到视频真正所在的链接 第三步:获取链接并转换成机械语言 第四部:保存 保存步骤代码 import re import request ...
- 细说unittest-2
一.unittest模块官方文档: https://docs.python.org/3/library/unittest.html 二.一张图看懂unittest: 三.Unittest主要方法属性: ...