一次考试,n个人m道题,
给你全对的人数和全错的人数
求出字典序最小的答案序列,没有就输出-1
我的思路:分类讨论
每一种考卷的计数,看他和他的相反卷子分别等于p和q的可能
如果p||q,则要么在这些卷子中有正确答案,要么没有解
p==q==0,则找一个没有出现过的答案序列就好
正解是字母树,60行->90行
#include<cstdio> #include<cstdlib> #include<iostream> #include<algorithm> #include<map> using namespace std; int n,m,p,q; const int N=30003,M=503; string s[N]; map <string ,int > mp; string fz(string a) { for(int i=0;i<m;i++) if(a[i]=='Y') a[i]='N'; else a[i]='Y'; return a; } void print(string ans) { cout<<ans; exit(0); } string ck; void dfs(int pos) { if(pos==m) { if(mp[ck]==0 && mp[(fz(ck))]==0) print(ck); return ; } ck[pos]='N'; dfs(pos+1); ck[pos]='Y'; dfs(pos+1); } int sum; int main() { cin>>n>>m>>p>>q; for(int i=1;i<=n;i++) cin>>s[i],mp[s[i]]++; sort(s+1,s+n+1); n=unique(s+1,s+n+1)-s-1; if(p || q) { for(int i=1;i<=n;i++) { int cnt=mp[s[i]]; if(cnt==p && mp[fz(s[i])]==q) s[sum++]=s[i]; else if(cnt==q && mp[fz(s[i])]==p) s[sum++]=fz(s[i]); } if(sum) sort(s,s+sum),print(s[0]); else cout<<"-1"<<endl; } else { ck=s[1]; dfs(0); cout<<"-1"<<endl; } return 0; }