您的位置:首页 > 其它

UvaOJ 10132 - File Fragmentation

2012-10-30 10:42 232 查看
这个题是怎么回事我记不起来了。大概就是选最长和最短的一个一个试

057294910132File FragmentationAcceptedC++0.0082012-09-07 01:49:28
#include<iostream>
#include <string>
#include <vector>
#include <algorithm>
//#include <fstream>
//#include <cstdlib>

using namespace std;
//ifstream fin ("data.in");
//#define cin fin

vector<string> input;
vector< vector<int> >lists;
int len;

bool cmp(const string &a,const string &b){
if (a.size()<b.size())
return true;
return false;
}

int isSolution(const string &a){
int match=0;
for (int i=1;i<=len/2;i++){ //所有长度 ,枚举一半
if (!lists[i-1].empty()){
for (int j=0;j<lists[i-1].size();j++){//长度下的所有碎片
int ok=0;
string &curStr = input[lists[i-1][j]]; //在input找到该下标
for (int k=0;k<lists[len-i-1].size();k++){ //(文件长度-碎片长度)的长度的碎片
/*
if (lists[len-i-1][k]==lists[i-1][j]) //避免用同一个元素
continue;
*/
string newStr1 = curStr+input[lists[len-i-1][k]];
string newStr2 = input[lists[len-i-1][k]]+curStr; //组合起来
if (newStr1==a){ //判断是否相同
//cout<<a<<" "<<curStr<<" "<<coStr<<endl;
match++;
ok=1;
break;
}
else if (newStr2==a){
match++;
ok=1;
break;
}
}
}
}
}
//cout<<match<<endl;
if (match>=input.size()/2) //只要match一半就可行
return 1;
return 0;
}

int main(){
int c;
(cin>>c).get();
string tmp;
getline(cin,tmp);
while(c--){
input.clear();
string line="";
while(getline(cin,line)){
if (line=="")
break;
//cout<<line<<endl;
input.push_back(line);
}
sort(input.begin(),input.end(),cmp);
/*
for (int i=0;i<input.size();i++){
cout<<input[i]<<endl;
}
*/

len = (input.front().size()+input.back().size()); //寻找文件长度
int startidx = input.front().size();
int idx=0; //用一个二维vector储存各个文件长度的idx 1D为长度-1
lists.clear();
//根据长度分类,储存字符串在input中的下标
for (int i=1;i<=input.back().size();i++){
vector<int> xxx;
for (int j=idx;j<input.size();j++){
//cout<<j<<" :"<<input[j]<<endl;
if (input[j].size()==i){
xxx.push_back(j);
}
else{ //长度不同 直接开始寻找下一长度
idx = j;
break;
}
}
lists.push_back(xxx);
}
//cout<<"here"<<endl;
/*
for (int i=0;i<lists[startidx-1].size();i++){
cout<<lists[startidx-1][i]<<": "<<input[lists[startidx-1][i]]<<endl;
}
*/
for (int i=0;i<lists[startidx-1].size();i++){ //尝试所有可能组合
int ok=0;
for (int j=0;j<lists.back().size();j++){//选最长的和最短的搭配
if (lists[startidx-1][i]==lists.back()[j]) //如果front和back的长度一样,判断是否是同一元素
continue;
string file="";//在前面
file+=input[lists[startidx-1][i]];
file+=input[lists.back()[j]];
//cout<<file<<endl;
if (isSolution(file)){ //判断是否可行
ok=1;
cout<<file<<endl;
break;
}
file="";//在后面
file+=input[lists.back()[j]];
file+=input[lists[startidx-1][i]];
//cout<<file<<endl;
if (isSolution(file)){
ok=1;
cout<<file<<endl;
break;
}
}
if (ok)
break;
}
if (c)
cout<<endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: