题目的意思就是有n个一样的01串,每个都被分成两段,输入的就是2n个分别是什么,
然后要求原来那个01串是什么。实际就是两两组合,组成全部一样的。。
首先原字符串是一定某一个长度最短的,和某一个长度最长的串组成的,所以枚举最短和最长的所有组合,每个判断一下。
AC代码:
#include<iostream>
#include<string>
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
const int N = 300;
int Case;
int num;
string str[N];
int vis[N];
string target;
int coun;
int cmp (string a, string b) {
return a.size() < b.size();
}
int main () {
cin >> Case;
getchar();
getchar();
for (int c = 0 ;c < Case ; c++) {
coun = 0;
for (num = 0 ; ;num++) {
getline (cin , str[num]);
if (str[num] == "")
break;
}
if (c != 0) {
cout << endl;
}
sort(str ,str + num ,cmp);
int len = str[0].size();
int lenn = str[0].size() + str[num - 1].size();
for (int i = 0 ; ;i++) {
memset(vis , 0 ,sizeof(vis));
coun = 0;
target = str[i] + str[num - 1];
for (int j = 0 ; j < num ; j++) {
for (int k = 0 ; k < num ;k++) {
if (j == k)
continue;
if (str[j].size() + str[k].size() != lenn)
continue;
if (vis[k] || vis[j])
continue;
if (str[k] + str[j] == target) {
coun++;
vis[k] = vis[j] = 1;
}
}
}
if (coun == num / 2) {
cout << target <<endl;
break;
}
else {
memset(vis , 0 ,sizeof(vis));
coun = 0;
target = str[num - 1] + str[i];
for (int j = 0 ; j < num ; j++) {
for (int k = 0 ; k < num ;k++) {
if (j == k)
continue;
if (str[j].size() + str[k].size() != lenn)
continue;
if (vis[k] || vis[j])
continue;
if (str[k] + str[j] == target) {
coun++;
vis[k] = vis[j] = 1;
}
}
}
}
if (coun == num / 2) {
cout << target <<endl;
break;
}
}
}
}