程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ 1056 IMMEDIATE DECODABILITY (字典樹)

POJ 1056 IMMEDIATE DECODABILITY (字典樹)

編輯:C++入門知識

 


題意:給你一些字符串,要你判斷有沒有其中的一個字符串是另外一個字符串的前綴。

題解:字典樹解決。

 


AC代碼:

#include <iostream>   
#include <cstdio>   
#include <cstring>   
#include <string>   
#include <cstdlib>   
#include <cmath>   
#include <vector>   
#include <list>   
#include <deque>   
#include <queue>   
#include <iterator>   
#include <stack>   
#include <map>   
#include <set>   
#include <algorithm>   
#include <cctype>   
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;i<N;i++)  
            next[i]=NULL;  
    }  
}*root;  
  
void setroot()  
{  
    root=(Trie *)malloc(sizeof(Trie));  
    for(int i=0;i<N;i++)  
        root->next[i] = NULL;  
}  
  
void createTrie(char *str)  
{  
    int i,j,id;  
    int len=strlen(str);  
    Trie *p=root,*m;  
    for(i=0;i<len;i++)  
    {  
        id=str[i]-'0';  
        if(p->next[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;i<len;i++)  
    {  
        id=str[i]-'a';  
        p=p->next[id];  
        if(p==NULL)     //若為空集,表示不存以此為前綴的串   
            return 0;  
    }  
    return p->v;   //此串是字符集中某串的前綴,這個地方可能要判斷是否在結尾節點   
}  
  
void dealTrie(Trie *T)  
{//若果有多組數據-多棵樹,那麼要釋放內純   
    int i;  
    if(T==NULL)  
        return ;  
    for(i=0;i<N;i++)  
        if(T->next[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 <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <list>
#include <deque>
#include <queue>
#include <iterator>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <cctype>
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;i<N;i++)
            next[i]=NULL;
    }
}*root;

void setroot()
{
    root=(Trie *)malloc(sizeof(Trie));
    for(int i=0;i<N;i++)
        root->next[i] = NULL;
}

void createTrie(char *str)
{
    int i,j,id;
    int len=strlen(str);
    Trie *p=root,*m;
    for(i=0;i<len;i++)
    {
        id=str[i]-'0';
        if(p->next[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;i<len;i++)
    {
        id=str[i]-'a';
        p=p->next[id];
        if(p==NULL)     //若為空集,表示不存以此為前綴的串
            return 0;
    }
    return p->v;   //此串是字符集中某串的前綴,這個地方可能要判斷是否在結尾節點
}

void dealTrie(Trie *T)
{//若果有多組數據-多棵樹,那麼要釋放內純
    int i;
    if(T==NULL)
        return ;
    for(i=0;i<N;i++)
        if(T->next[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;
}


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved