小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.
时间限制:
1S
空间限制:
256M
这题刚开始没想到map,就直接打暴力了。后面才想到完全可以用map(yo自己怎么怎么sa呢)。
对于每一个学霸的答案,用map记录一下,及G[s]++(通过计数)。
然后枚举每一个学霸,如果他的答案在map里面正好出现了p次,与他完全相反的答案正好出现了q次,那么就可以更新答案了。
做完这步后,我们在判断一下是否存在无解的情况,无解的情况就是ans根本没有被更新。
当然,这题有一个坑,就是p=0且q=0的情况。
这个时候,答案就有点捉摸不定了。我们必须用到“加一算法”,从后面枚举(因为我们毕竟要得到字典序最小的)。
当枚举到某一个串,发现!G[s1]且!G[s2],那么输出这个串就好了。
(弱弱的说一句,不知道为什么只有95 pts)
1 #include<cstdio> 2 #include<cstring> 3 #include<string> 4 #include<algorithm> 5 #include<map> 6 #include<iostream> 7 using namespace std; 8 const int maxn=30005; 9 map <string,int> G; 10 char s[maxn][505],ans[505],tmp[505]; 11 int n,m,p,q; 12 void U(char c[]){ 13 for (int i=0; i<m; i++) if (c[i]>ans[i]) return; else tmp[i]=c[i]; 14 for (int i=0; i<m; i++) ans[i]=tmp[i]; 15 } 16 int main(){ 17 scanf("%d%d%d%d",&n,&m,&p,&q); 18 for (int i=0; i<m; i++) ans[i]=‘Z‘; 19 for (int i=1; i<=n; i++) scanf("%s",s[i]),G[s[i]]++; 20 for (int i=1; i<=n; i++){ 21 char s0[505]; memset(s0,0,sizeof s0); 22 for (int j=0; j<m; j++){ 23 char c=s[i][j]; 24 if (c==‘Y‘) c=‘N‘; else c=‘Y‘; 25 s0[j]=c; 26 } 27 int x=G[s[i]],y=G[s0]; 28 if (G[s[i]]==p&&G[s0]==q) U(s[i]); 29 if (G[s[i]]==q&&G[s0]==p) U(s0); 30 } 31 bool fl=1; 32 for (int i=0; i<m; i++) if (ans[i]!=‘Z‘){fl=0; break;} 33 if (!fl) for (int i=0; i<m; i++) putchar(ans[i]); 34 else if (p==0&&q==0){ 35 string s1,s2; bool cango=0; 36 for (int i=0; i<m; i++) s1+=‘N‘,s2+=‘Y‘; 37 while(1){ 38 if(!G[s1]&&!G[s2]){cout<<s1; cango=1; return 0;} 39 int flag=-1; 40 for (int i=m-1; i>=0; i--) if(s1[i]==‘N‘){flag=i; break;} 41 if(flag==-1){puts("-1"); cango=1; return 0;} 42 s1[flag]=‘Y‘,s2[flag]=‘N‘; 43 for (int i=flag+1; i<m; i++) s1[i]=‘N‘,s2[i]=‘Y‘; 44 } 45 if (!cango) puts("-1"); 46 }else puts("-1"); 47 return 0; 48 }
时间: 2024-10-05 15:32:27