码迷,mamicode.com
首页 > 其他好文 > 详细

Immediate Decodability[UVA644](Trie树入门)

时间:2020-01-31 22:32:48      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:多少   tin   include   ios   dfs   length   immediate   有一个   str   

传送门

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

这题真的可以算是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\n", case_num);
        else printf("Set %d is immediately decodable\n", case_num);
    }
    return 0;
}

Immediate Decodability[UVA644](Trie树入门)

标签:多少   tin   include   ios   dfs   length   immediate   有一个   str   

原文地址:https://www.cnblogs.com/zcr-blog/p/12246921.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!