题意:给你一些文件碎片,问原文件是什么,当然也可能不能找到原文件,其实方法就是:如果能找到原文件的话,一定是最长的一个,如果最长的有好几个的话,也是不影响接下来的查找,然后我们只要在最短的中间寻找就可以了,注意有两种组合方法
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string.h>
#include <algorithm>
using namespace std;
const int MAXN = 1005;
struct node
{
char str[MAXN];
int len;
};
int max_files;
node s[MAXN];
bool cmp(const node &a,const node &b)
{
return a.len < b.len;
}
int check(char *t)
{
int i,flag,j,k,m;
flag = 1 ;
for(i = 0 ; i < max_files && flag ; i++)
{
flag = 0 ;
for(j = 0; t[j]; j++)
{
for(k = 0, m = j; s[i].str[k] && s[i].str[k] == t[m]; k++,m++)
;
if(k == s[i].len)
if(j == 0 || t[m] == '\0') //要么是它前一部分,要么是后一部分
flag = 1;
}
}
if(flag)
return 1;
else return 0;
}
int main()
{
int t,i,min_len,flag,j;
char temp1[MAXN];
char temp2[MAXN];
cin >> t;
getchar();
getchar();
while(t--)
{
i = 0;
flag = 0;
while(gets(temp1))
{
if(temp1[0] == 0)
break;
s[i].len = strlen(temp1);
memcpy(s[i].str,temp1,sizeof(temp1));
i++;
}
max_files = i ;
sort(s,s+max_files,cmp);
min_len = s[0].len;
memcpy(temp1,s[max_files-1].str,sizeof(temp1));
for(i = 0 ; i < max_files && !flag && s[i].len == min_len ; i++)
{
strcat(temp1,s[i].str);
j = check(temp1);
if(j)
{
flag = 1 ;
break;
}
memcpy(temp2,s[i].str,sizeof(temp2));
strcat(temp2,s[max_files-1].str);
j = check(temp2);
if(j)
{
flag = 2 ;
break;
}
}
if(flag == 1)
cout<<temp1<<endl;
else cout<<temp2<<endl;
if(t)
cout<<endl;
}
return 0;
}