題目:
題意:
給出個答案,已知其中有個是全對的,個是全錯的,其他的既不是全對也不是全錯
問標準答案是什麼,輸出字典序較小的那一個
分析:
我們用枚舉標準答案是多少來求解,用或哈希來判斷全對和全錯時的正確答案是不是這一個,若是,則當前答案就是我們的結果
有一種特殊情況就是同時,這個時候我們發現我們不能通過普通的枚舉來確定最終答案,所以我們用結合來尋找答案
代碼:
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
#define LL long long
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
map<string,int> m1,m2;
string s[30005],z;
int n=read(),m=read(),p=read(),q=read(),tf=0;
void dfs(int k,string zz)
{
if(tf) return;
if(k>m)
{
if(m2[zz]!=q) return;
for(int i=1;i<=n;i++) if(s[i]==zz) return;
cout<<zz;tf=1;
return;
}
dfs(k+1,zz+'N');
dfs(k+1,zz+'Y');
return;
}
int main()
{
for(int i=1;i<=n;i++)
{
cin>>z;s[i]=z;
m1[z]++;
for(int j=0;j<m;j++) z[j]=(z[j]=='Y'?'N':'Y');
m2[z]++;
}
if(!p&&!q) {dfs(1,"");return 0;}
sort(s+1,s+1+n);
if(!p)
for(int i=1;i<=n;i++)
for(int j=0;j<m;j++) s[i][j]=(s[i][j]=='Y'?'N':'Y');
for(int i=1;i<=n;i++)
if(m1[s[i]]==p&&m2[s[i]]==q) {cout<<s[i];return 0;}
printf("-1");
return 0;
}