zoukankan      html  css  js  c++  java
  • HDU单词的前缀 字典树

    要求输出每个单词在不产生歧义的情况下的最短前缀,直接构造出一颗字典树就可以了。先执行插入操作,对每一个单词经过的路径都进行一个自增的操作。再一次搜索每一个单词,当其遇到覆盖次数为一,或者是到了单词末尾就输出。

    代码如下:

    #include <cstdlib>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    int N, idx;
    
    char s[1005][25], rec[25];
    
    struct Node
    {
        int cnt, ch[26];
    }e[30000];
    
    int init()
    {
        ++idx;
        memset(e+idx, 0, sizeof (e[0]));
        return idx;
    }
    
    void insert(int p, char *in)
    {
        if (*in != '\0') {
            if (e[p].ch[*in-'a'] == 0) {
                e[p].ch[*in-'a'] = init();
            }
            ++e[ e[p].ch[*in-'a'] ].cnt;
            insert(e[p].ch[*in-'a'], in+1);
        }
    }
    
    void search(int p, char *in, int deep)
    {
        if (*in == 0 || e[p].cnt == 1) {
             rec[deep] = '\0'; 
        }
        else {
            rec[deep] = *in;
            search(e[p].ch[*in-'a'], in+1, deep+1);
        }
    }
    
    int main()
    {
        int Root, ca = 0;
        while (scanf("%d", &N) == 1) {
            idx = 0;
            Root = init();
            for (int i = 1; i <= N; ++i) {
                scanf("%s", s[i]);     
                insert(Root, s[i]);
            }
            printf("***Case %d\n", ++ca);
            for (int i = 1; i <= N; ++i) {
                printf("%s ", s[i]);
                search(Root, s[i], 0);
                puts(rec);
            }
        }
        return 0;
    }
  • 相关阅读:
    gbk与utf-8转换
    gdb注意事项
    Ubuntu导入证书
    Ubuntu 修改hosts
    GDB配置与.gdbinit的编写
    linux中用户的主目录~
    关于C++构造函数初始化顺序
    C++中的static关键字的总结
    Flutter移动电商实战 --(2)建立项目和编写入口文件
    Flutter移动电商实战 --(1)项目学习记录
  • 原文地址:https://www.cnblogs.com/Lyush/p/2617704.html
Copyright © 2011-2022 走看看