心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
题目大意:一些相同的01串被打碎成两半,现在给出这些打碎了之后的串,要求求出原串。
首先,原串的长度一定是打碎了之后的串中最长的长度加上最短的长度。设打碎之后的串中最长串组成集合S,最短串组成集合T,那么原串肯定为ST或TS中的某种。由于S、T中元素个数必定小于等于2,所以可能的结果最多只有8种。枚举这8种结果,然后检测是否符合要求即可。
检测的时候,对于某个长度为L的串,要快速检索到长度为(maxlength+minlength-L)的串,使用multimap<int,string>可以很方便地做到。
以下是我的代码:
#include<iostream>
#include
<vector>
#include
<string>
#include
<map>
#include
<algorithm>
#include
<cstdio>
using namespace std;

bool cmp(const string &a,const string &b)
{
    
return (a.size()<b.size() ||(a.size()==b.size() && a<b));
}

int main()
{
    #ifndef ONLINE_JUDGE
    freopen(
"data.in","r",stdin);
    freopen(
"data.out","w",stdout);
    
#endif

    
int T;
    cin
>>T;
    cin.
get();
    cin.
get();
    
bool first(true);
    
while(T--)
    {
        
int minl(0x7f7f7f7f),maxl(0);
        vector
<string> a;
        
string t;
        
while(getline(cin,t) && !t.empty())
        {
            a.push_back(t);
            minl
=min(minl,(int)(t.size()));
            maxl
=max(maxl,(int)(t.size()));
        }

        sort(a.begin(),a.end(),cmp);
        a.erase(unique(a.begin(),a.end()),a.end());

        multimap
<int,string> r;
        
for(int i=0;i<a.size();i++)
            r.insert(make_pair(a[i].size(),a[i]));

        
string ans;
        multimap
<int,string>::iterator
            ibegin
=r.begin(),
            iend
=r.upper_bound(minl),
            jend
=r.end(),
            jbegin
=r.lower_bound(maxl);
        
for(multimap<int,string>::iterator i=ibegin;i!=iend;i++)
            
for(multimap<int,string>::iterator j=jbegin;j!=jend;j++)
            {
                
string now(i->second+j->second);
                
bool success(true);
                
for(multimap<int,string>::iterator k=r.begin();k!=r.end();k++)
                {
                    multimap
<int,string>::iterator
                        pbegin
=r.lower_bound(minl+maxl-k->first),
                        pend
=r.upper_bound(minl+maxl-k->first);
                    
bool can(false);
                    
for(multimap<int,string>::iterator l=pbegin;l!=pend;l++)
                    {
                        
if(k->second+l->second==now || l->second+k->second==now)
                            can
=true;
                    }
                    
if(!can)
                    {
                        success
=false;
                        
break;
                    }
                }
                
if(success)
                    ans
=now;

                now
=j->second+i->second;
                success
=true;
                
for(multimap<int,string>::iterator k=r.begin();k!=r.end();k++)
                {
                    multimap
<int,string>::iterator
                        pbegin
=r.lower_bound(minl+maxl-k->first),
                        pend
=r.upper_bound(minl+maxl-k->first);
                    
bool can(false);
                    
for(multimap<int,string>::iterator l=pbegin;l!=pend;l++)
                    {
                        
if(k->second+l->second==now || l->second+k->second==now)
                            can
=true;
                    }
                    
if(!can)
                    {
                        success
=false;
                        
break;
                    }
                }
                
if(success)
                    ans
=now;
            }

        
if(first)
            first
=false;
        
else
            cout
<<endl;
        cout
<<ans<<endl;
    }

    
return 0;
}
posted on 2011-05-20 15:44 lee1r 阅读(1019) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:数据结构题目分类:排序

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理