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周年纪念碑,作为杰出校友的你被找了过来,帮校方确定纪念碑的选址. 纪念中学的土地可以看作是一 ...
随机推荐
- Matplotlib_常用图表
Matplotlib绘图一般用于数据可视化 1.常用的图表有: 折线图(坐标系图) 散点图/气泡图 条形图/柱状图 饼图 直方图 箱线图 热力图 折线图(坐标系图) 折线图用于显示随时间或有序类别的变 ...
- python基础一 day9 函数升阶(3)
局部命名空间一般之间是独立,局部命名空间是调用函数时生成的函数的名字指向它所在的地址局部不会对全局产生影响,除非加global.# def max(a,b):# return a if a>b ...
- DS博客作业08--课程总结
DS博客作业08--课程总结 1.当初你是如何做出选择计算机专业的决定的? 1.1 经过一年学习,你的看法改变了么,为什么? 1.2 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗? 为什么? 1. ...
- shell补充知识点
一.cut(截取) 1.按字节截取(-b) 例:/etc/passwd文件截取 head -5 passwd | cut -b 1-4 ----->截取1-4的字节 head -5 passwd ...
- 安装VC++6.0实验环境
安装VC++6.0步骤:(1)下载一个压缩包进行解压(2)点击打开解压后的文件(3)找到文件里的程序进行安装(4)等待安装完成该程序后可以试着运行一下此程序,在此我们需要了解编写程序的步骤和注意事项. ...
- struts2的单个文件上传
本文主要两种方式,一:通过 FileUtils.copyFile(file, savefile);方法复制:二:通过字节流方式复制 web.xml <?xml version="1.0 ...
- shell脚本,批量创建10个系统帐号并设置密码为随机8位字符串。
[root@localhost wyb]# cat user10.sh #!/bin/bash #批量创建10个系统帐号wangyb01-wangyb10并设置密码(密码为随机8位字符串). > ...
- ios软件设计中注意点
1.取消系统自带渲染效果 2.取消屏幕旋转 3.项目中搜索丢失文件
- 利用javascript实现二维数组的筛选
背景: 在项目中,我需要对解析后的nc文件数据进行筛选,选出符合要求的点,绘制相应的polygon. 代码:ajax获取某一时刻的数据 var url ="/api/config/PostC ...
- window nodejs 版本管理器 nvm-windows 教程
先去https://github.com/coreybutler/nvm-windows/releases 下载nvm-setup.zip 安装 安装的过程中会提示是否获取nodejs的管理权限,点确 ...