Immediate Decodability[UVA644](Trie入门)

传送门

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

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

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

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

#include 
#include 
#include 
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\n", case_num);
        else printf("Set %d is immediately decodable\n", case_num);
    }
    return 0;
}

你可能感兴趣的:(Immediate Decodability[UVA644](Trie入门))