zoukankan      html  css  js  c++  java
  • 正确答案

    【题目描述】

    小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.

    /*
      直接map模拟,一开始p=q=0的情况判错了,以为无解
      而且由于输入用的cin,TLE成SB了,以后字符串不要用cin。
    */
    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #include<algorithm>
    #include<map>
    #define N 30010
    #define M 510
    using namespace std;
    string ans[N];char ss[M];
    map<string,int> mp;
    int n,m,p,q;
    void work1(){
        int A[510]={0};bool ok=false;
        while(1){
            string now="",fan="";
            for(int i=0;i<m;i++)
                if(!A[i])now+="N",fan+="Y";
                else now+="Y",fan+="N";
            if(!mp[now]&&!mp[fan]){
                cout<<now;ok=true;break;
            }
            A[m-1]++;bool gogogo=false;
            for(int i=m-1;i>=0;i--){
                if(A[i]==2){
                    if(i==0)break;
                    A[i]=0;A[i-1]++;
                }
                else {
                    gogogo=true;
                    break;
                }
            }
            if(!gogogo)break;
        }
        if(!ok)printf("-1");
    }
    void work2(){
        bool ok=false;
        for(int i=1;i<=n;i++){
            int num=mp[ans[i]];
            if(num!=p)continue;
            string fan="";
            for(int j=0;j<m;j++)
                if(ans[i][j]=='N')fan+="Y";
                else fan+="N";
            if(!mp[fan]){
                cout<<ans[i];ok=true;break;
            }
        }
        if(!ok)printf("-1");
    }
    void work3(){
        bool ok=false;
        for(int i=1;i<=n;i++){
            int num=mp[ans[i]];
            if(num!=q)continue;
            string fan="";
            for(int j=0;j<m;j++)
                if(ans[i][j]=='N')fan+="Y";
                else fan+="N";
            if(!mp[fan]){
                cout<<fan;ok=true;break;
            }
        }
        if(!ok)printf("-1");
    }
    void work4(){
        bool ok=false;
        for(int i=1;i<=n;i++){
            int num=mp[ans[i]];
            if(num!=p)continue;
            string fan="";
            for(int j=0;j<m;j++)
                if(ans[i][j]=='N')fan+="Y";
                else fan+="N";
            if(mp[fan]==q){
                cout<<ans[i];ok=true;break;
            }
        }
        if(!ok)printf("-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++){
            scanf("%s",ss);
            for(int j=0;j<m;j++)
                ans[i]+=ss[j];
            mp[ans[i]]++;
        }
        sort(ans+1,ans+n+1);
        if(p==0&&q==0)work1();
        if(p&&q==0)work2();
        if(p==0&&q)work3();
        if(p&&q)work4();
        return 0;
    }
  • 相关阅读:

    模块
    18 安装kali系统
    17 部署靶机环境下
    16 部署靶机环境上
    15 部署win2003和IIS服务
    Spring详解(十一)----Bean 的作用域
    Spring详解(十)----使用@Configuration与@Bean注解装配Bean
    Spring详解(九)----Spring Bean的自动装配(基于注解的方式【推荐】)
    Spring详解(八)----Spring Bean的装配(基于注解的方式【推荐】)
  • 原文地址:https://www.cnblogs.com/harden/p/6063275.html
Copyright © 2011-2022 走看看