题意:有n分相同的文件被任意撕碎成了2n份,要求得到原来的文件的其中一种可能情况。
题解:先得出原先的文件的长度temp,然后将长度之和刚好是temp拼起来是两种情况,都存到数组中,sort排序,将相同的都放在了一起,如果相同的数量超过了n,说明是有可能是原先的文件。
#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 300;
string str[N];
int len[N];
string vis[N];
int main() {
int t;
scanf("%d", &t);
getchar();
getchar();
while (t--) {
int n = 0, sum = 0;
while (getline(cin, str[n]) && str[n] != "") {
int len1 = str[n].size();
sum += len1;
len[n] = len1;
n++;
}
int temp = sum * 1.0 / n * 2;//原先长度
int num = 0;
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++)
if (len[i] + len[j] == temp) {
vis[num++] = str[i] + str[j];
vis[num++] = str[j] + str[i];
}
sort(vis, vis + num);
int m = 0, k;
for (k = 0; k < num - 1; k++)
if (vis[k] == vis[k + 1])
m++;
else
if (m >= (n / 2 - 1)) {
cout << vis[k] << endl;
break;
}
if (k == num - 1 && m >= (n / 2 - 1))
cout << vis[num- 1] << endl;
if (t)
cout << endl;
}
return 0;
}