zoukankan      html  css  js  c++  java
  • [字典树入门] HDOJ 1251 统计难题

    不需要保存是否结束(isend),在插入时每经过一个节点,将该节点的计数器 +1,在查找时输出最后一个字符所在节点的cnt值即可;
    PS:为什么加了删除树(del_Trie)会超时呢?

    # include <cstdio>
    # include <cstring>
    
    # define LEN 10 + 1
    
    struct node
    {
        int cnt;
        node * next[26];
        node ()
        {
            cnt = 0;
            memset(next, 0, sizeof(next));
        }
    };
    
    void insert_Trie(node *root, char *s)
    {
        int c;
        node *p = root;
        for (int i = 0; s[i]; ++i)
        {
            c = s[i]-'a';
            if (p->next[c] == NULL) p->next[c] = new node;
            p = p->next[c];
            ++(p->cnt);
        }
    }
    
    void build_Trie(node *root)
    {
        char s[LEN];
        while (gets(s) , strcmp(s, ""))
        {
            insert_Trie(root, s);
        }
    }
    
    void del_Trie(node *p)
    {
        for (int i = 0; i < 26; ++i)
            if (p->next[i]) del_Trie(p->next[i]);
        del_Trie(p);
    }
    
    int search(node *root, char *s)
    {
        int c;
        node *p = root;
        for (; *s; ++s)
        {
            c = *s-'a';
            if (p->next[c]) p = p->next[c];
            else return 0;
            if ((*(s+1)) == 0) return p->cnt;
        }
        return 0;
    }
    
    void solve(void)
    {
        char s[LEN];
        node *root = new node;
        build_Trie(root);
        while (gets(s) != NULL)
        {
            int ans = search(root, s);
            printf("%d\n", ans);
        }
        //del_Trie(root);     //TLE 
    }
    
    int main()
    {
        solve();
    
        return 0;
    }
  • 相关阅读:
    jenkins+newman+postman实现api自动化
    数据库的关闭方法
    获取2台linux机器的时间差
    性能测试与其分析
    todo:云数据库的元信息
    todo:trove命令使用
    syslog协议及rsyslog服务全解析
    C++Primer学习日记
    excel-填充
    excel-删除
  • 原文地址:https://www.cnblogs.com/JMDWQ/p/2624096.html
Copyright © 2011-2022 走看看