题目大意:有n个相同的文件,每个文件从中间分为两半,现在给你这2n个文件碎片,求原来完整的文件。
找出文件碎片长度的最大值和最小值,二者相加可得到原来文件的长度len。然后逐个进行拼接,将拼接后长度等于len的加入到map中,最后map中出现次数最多的就是原文件。
#include <cstdio>
#include <iostream>
#include <string>
#include <map>
using namespace std;
#define FILEN 150
#define SIZEN 256*8+10 string str[FILEN];
map<string, int> m; int main()
{
#ifdef LOCAL
freopen("in", "r", stdin);
#endif
char s[];
int T;
scanf("%d", &T);
getchar();
gets(s);
while (T--)
{
int n = ;
while (gets(s))
{
if (!s[]) break;
str[n++] = s;
}
int min_len = , max_len = ;
for (int i = ; i < n; i++)
{
if (str[i].size() < min_len) min_len = str[i].size();
if (str[i].size() > max_len) max_len = str[i].size();
}
int len = max_len + min_len;
map<string, int>::iterator it;
m.clear();
for (int i = ; i < n; i++)
for (int j = i+; j < n; j++)
{
string t = str[i] + str[j];
if (t.size() == len)
{
it = m.find(t);
if (it != m.end()) m[t]++;
else m[t] = ;
}
t = str[j] + str[i];
if (t.size() == len)
{
it = m.find(t);
if (it != m.end()) m[t]++;
else m[t] = ;
}
}
int lmax = ;
string ans;
for (it = m.begin(); it != m.end(); it++)
if (it->second > lmax)
{
lmax = it->second;
ans = it->first;
}
cout << ans << endl;
if (T) printf("\n");
}
return ;
}