HDU 1305:Immediate Decodability

来源:互联网 发布:java二分递归 编辑:程序博客网 时间:2024/05/21 17:56

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1305


题目翻译:

给出一系列0,1串,以字符串“9”结束,其中的一个串不能是另一个串的前缀,

如果出现这种情况,则输出is not decodeable,否则要输出is decodeable.


解题思路:

简单字典树。



AC代码:

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>using namespace std;char str[15];bool flag;///字典树节点typedef struct TrieNode {    bool isWord;    struct TrieNode *son[2];}Trie;void insertWord(Trie *root) {    Trie *p = root;    int i = 0;    char ch = str[i];    while(ch != '\0') {        int num = ch-'0';        if(p->son[num] == NULL) {            Trie *node = (Trie*)malloc(sizeof(Trie));            for(int i = 0; i < 2; i++) {                node->son[i] = NULL;            }            node->isWord = false;            p->son[num] = node;            p = p->son[num];        }        else {            if(p->son[num]->isWord == true) {                flag = false;                break;                return;            }            else {                p = p->son[num];            }        }        ch = str[++i];    }    p->isWord = true;}void freeTrie(Trie *root) {    for(int i = 0; i < 2; i++) {        if(root->son[i] != NULL) {            freeTrie(root->son[i]);        }    }    free(root);}int main() {    flag = true;    Trie *root = (Trie*)malloc(sizeof(Trie));    for(int i = 0; i < 2; i++) {        root->son[i] = NULL;    }    int Case = 0;    while(~scanf("%s",str)) {        if(strcmp(str,"9")==0) {            if(flag) {                printf("Set %d is immediately decodable\n",++Case);            }            else {                printf("Set %d is not immediately decodable\n",++Case);            }            flag = true;            freeTrie(root);            root = (Trie*)malloc(sizeof(Trie));            for(int i = 0; i < 2; i++) {                root->son[i] = NULL;            }        }        else {            if(flag) {                insertWord(root);            }        }    }    return 0;}



原创粉丝点击