|
题目名称 |
正确答案 |
序列问题 |
长途旅行 |
|
英文名称 |
answer |
sequence |
travel |
|
输入文件名 |
answer.in |
sequence.in |
travel.in |
|
输出文件名 |
answer.out |
sequence.out |
travel.out |
|
时间限制 |
1s |
1s |
1s |
|
空间限制 |
256M |
256M |
256M |
|
测试点数目 |
20 |
20 |
10 |
|
测试点分值 |
5 |
5 |
10 |
|
是否有部分分 |
无 |
无 |
无 |
|
题目类型 |
传统 |
传统 |
传统 |
|
是否有SPJ |
无 |
无 |
无 |
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.
暴力50:
/* 自己还是太弱~没看出来要用hash 只是觉得自己的作法慢~ QAQ 50分暴力 先排序 一样的缩成一种 然后枚举正确答案是哪个 q==0 p==0的情况没考虑到~ */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 30010 #define maxm 510 using namespace std; int n,m,p,q,cnt; string g[maxn]; struct node{ int len; string s; }k[maxn]; int cmp(int a[maxm],int b[maxm]){ for(int i=1;i<=m;i++){ if(a[i]<b[i])return 1; if(a[i]>b[i])return 0; } return 1; } int main() { freopen("answer.in","r",stdin); freopen("answer.out","w",stdout); scanf("%d%d%d%d",&n,&m,&p,&q); for(int i=1;i<=n;i++)cin>>g[i]; sort(g+1,g+1+n); int l=1,r; for(r=2;r<=n;r++){ if(g[r]==g[l])continue; k[++cnt].s=g[l]; k[cnt].len=r-l;l=r; } k[++cnt].s=g[l]; k[cnt].len=r-l; int falg=0; for(int i=1;i<=cnt;i++){ if(k[i].len!=p)continue; int sum=0; string x;x.clear(); for(int j=0;j<m;j++) if(k[i].s[j]=='Y')x+='N'; else x+='Y'; for(int j=1;j<=cnt;j++) if(k[j].s==x){ sum+=k[j].len; break; } if(sum==q){ cout<<k[i].s; falg=1;break; } } if(falg==0) for(int i=1;i<=cnt;i++){ if(k[i].len!=q)continue; int sum=0; string x;x.clear(); for(int j=0;j<m;j++) if(k[i].s[j]=='Y')x+='N'; else x+='Y'; for(int j=1;j<=cnt;j++) if(k[j].s==x){ sum+=k[j].len; break; } if(sum==p){ cout<<x; falg=1;break; } } if(!falg)printf("-1\n"); return 0; }