设为首页 加入收藏

TOP

POJ 1056 IMMEDIATE DECODABILITY (字典树)
2014-11-23 18:53:37 来源: 作者: 【 】 浏览:6
Tags:POJ 1056 IMMEDIATE DECODABILITY 字典


题意:给你一些字符串,要你判断有没有其中的一个字符串是另外一个字符串的前缀。

题解:字典树解决。


AC代码:

#include    
#include    
#include    
#include    
#include    
#include    
#include    
#include    
#include    
#include    
#include    
#include    
#include    
#include    
#include    
#include    
using namespace std;  
  
typedef __int64 LL;  
const int N=2;  
const LL mod=1000000007LL;  
const int INF=0x3f3f3f3f;  
const double PI=acos(-1.0);  
  
char s[15];  
  
struct Trie  
{  
    Trie *next[N];  
    int v;  
    Trie()  
    {  
        v=1;  
        for(int i=0;inext[i] = NULL;  
}  
  
void createTrie(char *str)  
{  
    int i,j,id;  
    int len=strlen(str);  
    Trie *p=root,*m;  
    for(i=0;inext[id]==NULL)  
        {  
            p->next[id]=new Trie();  
            p=p->next[id];  
        }  
        else  
        {  
            p=p->next[id];  
        }  
    }  
    p->v++;  
}  
  
int findTrie(char *str)  
{  
    int i,id;  
    int len=strlen(str);  
    Trie *p=root;  
    for(i=0;inext[id];  
        if(p==NULL)     //若为空集,表示不存以此为前缀的串   
            return 0;  
    }  
    return p->v;   //此串是字符集中某串的前缀,这个地方可能要判断是否在结尾节点   
}  
  
void dealTrie(Trie *T)  
{//若果有多组数据-多棵树,那么要释放内纯   
    int i;  
    if(T==NULL)  
        return ;  
    for(i=0;inext[i]!=NULL)  
            dealTrie(T->next[i]);  
    free(T);//释放   
}  
  
int flag;  
void dfs(Trie *Tr)  
{  
    if(flag)    return ;  
    if(Tr->v>1&&(Tr->next[0]!=NULL||Tr->next[1]!=NULL))  
    {  
        flag=1;  
        return ;  
    }  
    for(int i=0;i<2;i++)  
    {  
        if(Tr->next[i]==NULL)  
            continue;  
        dfs(Tr->next[i]);  
    }  
}  
  
int main()  
{  
    int i,j,p=1,ca=0;  
    while(scanf("%s",s)!=EOF)  
    {  
        if(p)  
            root=new Trie();  
        if(strcmp(s,"9")!=0)  
        {  
            createTrie(s);  
            p=0;  
        }  
        else  
        {  
            flag=0;  
            dfs(root);  
            if(flag)    printf("Set %d is not immediately decodable\n",++ca);  
            else    printf("Set %d is immediately decodable\n",++ca);  
            dealTrie(root);  
            p=1;  
        }  
    }  
    return 0;  
}  

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

typedef __int64 LL;
const int N=2;
const LL mod=1000000007LL;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);

char s[15];

struct Trie
{
    Trie *next[N];
    int v;
    Trie()
    {
        v=1;
        for(int i=0;inext[i] = NULL;
}

void createTrie(char *str)
{
    int i,j,id;
    int len=strlen(str);
    Trie *p=root,*m;
    for(i=0;inext[id]==NULL)
        {
            p->next[id]=new Trie();
            p=p->next[id];
        }
        else
        {
            p=p->next[id];
        }
    }
    p->v++;
}

int findTrie(char *str)
{
    int i,id;
    int len=strlen(str);
    Trie *p=root;
    for(i=0;inext[id];
        if(p==NULL)     //若为空集,表示不存以此为前缀的串
            return 0;
    }
    return p->v;   //此串是字符集中某串的前缀,这个地方可能要判断是否在结尾节点
}

void dealTrie(Trie *T)
{//若果有多组数据-多棵树,那么要释放内纯
    int i;
    if(T==NULL)
        return ;
    for(i=0;inext[i]!=NULL)
            dealTrie(T->next[i]);
    free(T);//释放
}

int flag;
void dfs(Trie *Tr)
{
    if(flag)    return ;
    if(Tr->v>1&&(Tr->next[0]!=NULL||Tr->next[1]!=NULL))
    {
        flag=1;
        return ;
    }
    for(int i=0;i<2;i++)
    {
        if(Tr->next[i]==NULL)
            continue;
        dfs(Tr->next[i]);
    }
}

int main()
{
    int i,j,p=1,ca=0;
    while(scanf("%s",s)!=EOF)
    {
        if(p)
            root=new Trie();
        if(strcmp(s,"9")!=0)
        {
            createTrie(s);
            p=0;
        }
        else
        {
            flag=0;
            dfs(root);
            if(flag)    printf("Set %d is not immediately decodable\n",++ca);
            else    printf("Set %d is immediately decodable\n",++ca);
            dealTrie(root);
            p=1;
        }
    }
    return 0;
}


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hdu 4571 Travel in time ( 图论+.. 下一篇POJ 1844 Sum[简单数学]

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Python 教程 - W3Sch (2025-12-26 12:00:51)
·Python基础教程,Pyt (2025-12-26 12:00:48)
·神仙级python入门教 (2025-12-26 12:00:46)
·“我用Java 8”已成 (2025-12-26 11:19:54)
·下载 IntelliJ IDEA (2025-12-26 11:19:52)