天天看點

正确答案(字元串處理)

正确答案

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
const int maxn=30010;
int n,m,r,w,tot,a[maxn],f[maxn];
char in[maxn];
bool ifgo;
string s[maxn];
map<string,int> g;
bool judge(int x,int y)
{
  int len1=s[x].size();
  int len2=s[y].size();
  for(int i=0;i<len1;i++)
  if((s[x][i]=='N'&&s[y][i]=='N')||
    (s[x][i]=='Y'&&s[y][i]=='Y'))
    return 0;
  return 1;
}
bool can(int x)
{
  string t=s[x];
  int sum=0;
  for(int i=0;i<t.size();i++)
  {
    if(t[i]=='N')
    t[i]='Y';
    else t[i]='N';
  }
  for(int i=1;i<=n;i++)
  if(t==s[i]) sum++;
  if(sum!=0)  return 0;
  return true;
}
void work1()
{
  string t1,t2;
  for(int i=0;i<m;i++)
  t1+='N',t2+='Y';
  while(1)
  {
    if(!g[t1]&&!g[t2])
    {
      cout<<t1;
      ifgo=1;
      return;
    }
    int flag=-1;
    for(int i=m-1;i>=0;i--)
    {
      if(t1[i]=='N')
      {
        flag=i;
        break;
      }
    }
    if(flag==-1)
    {
      printf("-1");
      ifgo=1;
      return;
    }
    t1[flag]='Y',t2[flag]='N';
    for(int i=flag+1;i<m;i++)
    t1[i]='N',t2[i]='Y';
  }
}
void work2()
{
  for(int i=1;i<=tot;i++)
  if(a[i]==r)
  {
    if(can(f[i]))
    {
      cout<<s[f[i]];
      ifgo=1;
      return;
    }
  }
}
void work3()
{
  for(int i=tot;i>=1;i--)
  if(a[i]==w)
  {
    if(can(f[i]))
    {
      for(int j=0;j<s[f[i]].size();j++)
      {
        if(s[f[i]][j]=='N')
        printf("Y");
        else printf("N");
      }
      ifgo=1;
      return;
    }
  }
}
void work4()
{
  for(int i=1;i<=tot;i++)
  if(a[i]==r)
  {
    for(int j=1;j<=tot;j++)
    {
      if(i==j) continue;
      if(a[j]==w)
      if(judge(f[i],f[j]))
      {
        cout<<s[f[i]];
        ifgo=1;
        return;
      }
    }
  }
  printf("-1");
  return;
}
int main()
{
  freopen("answer.in","r",stdin);
  freopen("answer.out","w",stdout);
  scanf("%d%d%d%d",&n,&m,&r,&w);
  for(int i=1;i<=n;i++)
  {
    scanf("%s",&in);
    for(int j=0;j<m;j++)
    s[i]+=in[j];
    g[s[i]]++;
  }
  sort(s+1,s+n+1);
  a[1]=1,tot=1,f[1]=1;
  for(int i=2;i<=n;i++)
  {
    if(s[i]==s[i-1])
    a[tot]++;
    else a[++tot]=1,f[tot]=i;
  }
  if(w==0&&r==0)       work1();
  else if(w==0&&!ifgo) work2();
  else if(r==0&&!ifgo) work3();
  else if(!ifgo)     work4();
  return 0;
}      

繼續閱讀