题目名称

正确答案

序列问题

长途旅行

英文名称

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;
}
View Code

相关文章:

  • 2021-12-15
  • 2021-11-19
  • 2021-06-06
  • 2022-01-04
  • 2021-12-22
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-12-15
  • 2021-12-14
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-28
  • 2021-12-15
相关资源
相似解决方案