Immediate Decodability[UVA644](Trie树入门)

Posted zcr-blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Immediate Decodability[UVA644](Trie树入门)相关的知识,希望对你有一定的参考价值。

传送门

题意:给出一些数字串,判断是否有一个数字串是另一个串的前缀。

这题真的可以算是Trie树的一道模板题了。

先把Trie树建好,建树的时候记录一个sum表示一个节点有多少个串会包含此节点,然后再记录一个end表示这个节点是不是一个串的结尾。

然后dfs/bfs遍历整个Trie树若一个节点x满足end[x]=true && sum[x]>=2则题目条件成立。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
string s;
int trie[1000][2];
int tot, sum[1000];
bool ennd[1000], ans;
void insert(string t) {
    int p = 1;
    for (int i = 0; i < (int)t.length(); i++) {
        int k = t[i] - 0;
        sum[p]++;
        if (!trie[p][k]) trie[p][k] = ++tot;
        p = trie[p][k];
    }
    sum[p]++;
    ennd[p] = 1;
}
void dfs(int x) {
    if (ennd[x] && sum[x] >= 2) ans = 1;
    if (trie[x][0]) {
        dfs(trie[x][0]);
    }
    if (trie[x][1]) {
        dfs(trie[x][1]);
    }
}
int case_num;
int main() {
    while (cin >> s) {
        case_num++;
        if (s[0] == 9) continue;
        ans = 0;
        tot = 1;
        memset(ennd, 0, sizeof(ennd));
        memset(sum, 0, sizeof(sum));
        memset(trie, 0, sizeof(trie));
        insert(s);
        while (cin >> s) {
            if (s[0] == 9) break;
            insert(s);
        }
        dfs(1);
        if (ans) printf("Set %d is not immediately decodable
", case_num);
        else printf("Set %d is immediately decodable
", case_num);
    }
    return 0;
}

以上是关于Immediate Decodability[UVA644](Trie树入门)的主要内容,如果未能解决你的问题,请参考以下文章

UVA644 Immediate Decodability

POJ--1056 IMMEDIATE DECODABILITY (字典树)

「UVA644」 Immediate Decodability(Trie

Immediate Decodability HDU - 1305(模板trie)

Immediate Decodability[UVA644](Trie树入门)

POJ 1056 IMMEDIATE DECODABILITY Trie 字符串前缀查找