【题目描述】
小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; }