题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1073
题意:
给出一个只包含0,1的字符串分割成两段后的结果,不同方法分割后的片段混在一起,要求出原来的字符串。
题解:暴力。
源字符串必定有最长的字符串和最短的字符串合并而成,最长和最短的组合只可能有8种情况,然后判断每个字符串是否符合要求。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
const int MAX=200;
string a[MAX];
int n;
bool cmp(string a,string b)
{
return a.size()<b.size();
}
bool check(string ss)
{
bool use[MAX];
memset(use,0,sizeof(use));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(!use[i]&&!use[j]&&a[i]+a[j]==ss)
{
use[i]=use[j]=true;
}
}
}
for(int i=0;i<n;i++)
{
if(use[i]==false)
return false;
}
return true;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T;
cin>>T;
getchar();
getchar();
while(T--)
{
n=0;
while(getline(cin,a[n]))
{
if(a[n]=="")break;
n++;
}
sort(a,a+n,cmp);
if((n>2&&a[0].size()!=a[1].size())||n==2)
{
if(check(a[0]+a[n-1]))
cout<<a[0]+a[n-1]<<endl;
else if(check(a[n-1]+a[0]))
cout<<a[n-1]+a[0]<<endl;
}
else
{
int flag=0;
for(int i=0;i<2;i++)
{
for(int j=n-1;j>n-3;j--)
{
if(!flag&&check(a[i]+a[j]))
{
cout<<a[i]+a[j]<<endl;
flag=1;
break;
}
else if(!flag&&check(a[j]+a[i]))
{
cout<<a[j]+a[i]<<endl;
flag=1;
break;
}
}
if(flag) break;
}
}
if(T) printf("\n");
}
return 0;
}