心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0

题目没有给出具体的规模,因此没有用枚举。我的做法是维护一棵Trie,把01串按长度从大到小的次序插入,这样就可以在插入时判断是否为之前某个长度更大串的前缀。尽管如此,依然用了0.408s的时间,可能与用cin/cout输入输出有关。
以下是我的代码:

#include<iostream>
#include
<vector>
#include
<string>
#include
<algorithm>
#include
<cstdio>
using namespace std;
const int kMaxn(10007);

bool cmp(const string &sa,const string &sb)
{
    
return (sa.size()>sb.size() || (sa.size()==sb.size() && sa<sb));
}

struct TreeNode
{
    TreeNode():left_(NULL),right_(NULL) {}

    TreeNode 
*left_,*right_;
};
class Trie
{
    
public:
        Trie()
        {
            father_
=new TreeNode;
        }
        
bool Insert(const string &s)
        {
            
bool re(false);
            TreeNode 
*p(father_);
            
for(int i=0;i<s.size();i++)
            {
                
if(s[i]=='0' && !p->left_)
                {
                    p
->left_=new TreeNode;
                    
if(i==s.size()-1)
                        re
=true;
                }
                
else if(s[i]=='1' && !p->right_)
                {
                    p
->right_=new TreeNode;
                    
if(i==s.size()-1)
                        re
=true;
                }
                
if(s[i]=='0')
                    p
=p->left_;
                
else
                    p
=p->right_;
            }
            
return re;
        }

    
private:
        TreeNode 
*father_;
};

int main()
{
    
/*
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    //
*/

    
int T(0);
    
string t;
    
while(cin>>t)
    {
        vector
<string> r;
        
while(t!="9")
        {
            r.push_back(t);
            cin
>>t;
        }

        sort(r.begin(),r.end(),cmp);
        Trie trie;
        
bool success(true);
        
for(vector<string>::iterator i=r.begin();i!=r.end();i++)
            
if(!trie.Insert(*i))
            {
                success
=false;
                
break;
            }

        T
++;
        
if(success)
            cout
<<"Set "<<T<<" is immediately decodable"<<endl;
        
else cout<<"Set "<<T<<" is not immediately decodable"<<endl;
    }

    
return 0;
}
posted on 2011-04-07 20:07 lee1r 阅读(424) 评论(1)  编辑 收藏 引用 所属分类: 题目分类:字符串处理题目分类:数据结构

FeedBack:
# re: UVa 644 Immediate Decodability
2012-06-24 21:07 | Backer
想得时候有点复杂了,但是能构建一棵树也不错呵呵  回复  更多评论
  

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