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;
}

浙公网安备 33010602011771号