UVA 1262

这道题直接暴力过的,但是需要注意的是找出的每一组的字母中不能有重复的,如果那样会导致重复子串。

#include<iostream>
#include<string>
#include<string>
#include<string.h>
#include<stdio.h>
#include<queue>
#include<math.h>
#include<vector>
#include<stdlib.h>
#define maxn 10000
#include<algorithm>
using namespace std;
char mapp[15][10];
char c[10][10];
int vis[26][26];
 int main(){
     int n,t,num[5];
     int i,j,k,l,m,sum,x;
     cin>>t;
     while(t--){
    cin>>n;
    memset(c,0,sizeof(c));
    memset(num,0,sizeof(num));
    memset(vis,0,sizeof(vis));
    sum=1;
    for( i=0;i<12;i++)
        for( j=0;j<5;j++)
            cin>>mapp[i][j];

    for( k=0;k<5;k++){
       x=0;
    for(i=0;i<6;i++){
        for(j=6;j<12;j++){
            if(mapp[i][k]==mapp[j][k]&&!vis[k][mapp[i][k]-'A']){
                c[k][x++]=mapp[j][k];
                vis[k][mapp[i][k]-'A']=1;
                num[k]=x;
            }
        }
    }
    sum*=x;
    sort(c[k],c[k]+x);

   }

    if(n>sum){cout<<"NO"<<endl;continue;}
   x=0;
   int flag=1;
   for(i=0;i<num[0];i++){
              if(!flag) break;
    for(j=0;j<num[1];j++){
                   if(!flag) break;
      for(k=0;k<num[2];k++){
               if(!flag) break;
        for(l=0;l<num[3];l++){
                  if(!flag) break;
            for(m=0;m<num[4];m++){
                   x++;
                   if(x==n){
                    cout<<c[0][i]<<c[1][j]<<c[2][k]<<c[3][l]<<c[4][m]<<endl;
                    flag=0;
                    break;
                   }
              }
        }
     }
 }
 }
     }
   return 0;
}

  

posted @ 2016-03-11 19:08  咸咸的告别  阅读(301)  评论(0编辑  收藏  举报