uva 10132 File Fragmentation

来源:互联网 发布:淘宝易趣网 编辑:程序博客网 时间:2024/05/21 09:54
题意:给你一些文件碎片,问原文件是什么,当然也可能不能找到原文件,其实方法就是:如果能找到原文件的话,一定是最长的一个,如果最长的有好几个的话,也是不影响接下来的查找,然后我们只要在最短的中间寻找就可以了,注意有两种组合方法
#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;}


原创粉丝点击