这道题直接暴力过的,但是需要注意的是找出的每一组的字母中不能有重复的,如果那样会导致重复子串。
#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; }