zoukankan      html  css  js  c++  java
  • trie树

    输入一系列字符串构成trie树 T ,空行,再输入字符串,查询 T 中以这些字符串为前缀的字符串数量。通过修改插入时,对 count 的操作,可以实现很多变形功能。杭电1251,1671

    #include<iostream>
    #include<vector>
    #include<queue>
    #include<string>
    using namespace std;
    
    #define TRIEMAX 26            //trie树中元素字符集大小,例如26个小写字母
    struct trieNode{            //trie树节点
        int count;
        trieNode* childs[TRIEMAX];
        trieNode(){
            count = 0;
            for (int i = 0; i < TRIEMAX; ++i)
                childs[i] = NULL;
        }
    };
    /* 插入操作,主要变形可以通过对count的操作实现 */
    void insertTrie(trieNode* root, string s)
    {
        int k;
        trieNode *cur = root;
        for (int i = 0; i < s.size(); ++i){
            k = s[i] - 'a';
            if (cur->childs[k] != NULL){
                cur = cur->childs[k];
                ++(cur->count);
            }
            else{
                cur->childs[k] = new trieNode;
                ++(cur->childs[k]->count);
                cur = cur->childs[k];
            }
        }
    }
    /* 在trie树中查找 s */
    int searchTrie(trieNode* root, string s){
        int k;
        trieNode *cur = root;
        for (int i = 0; i < s.size(); ++i){
            k = s[i] - 'a';
            if (cur->childs[k] == NULL) return 0;
            cur = cur->childs[k];
        }
        return cur->count;
    }
    /* 释放 trie 树 */
    void freeTrie(trieNode* root)
    {
        for (int i = 0; i < TRIEMAX; ++i)
            if (root->childs[i]) freeTrie(root->childs[i]);
        free(root);
    }
    /* 显示 trie树 */
    void showTrie(trieNode* root){
        trieNode* p = NULL;
        queue<trieNode*> q;
        q.push(root);
        while (!q.empty()){
            p = q.front(); q.pop();
            if (p){
                cout << p->count << ' ';
                for (int i = 0; i < TRIEMAX; ++i)
                    q.push(p->childs[i]);
            }
        }
        cout << endl;
    }
    /*
    测试数据
    banana
    band
    bee
    absolute
    acm
    
    ba
    b
    band
    abc
    */
    int main()
    {
        trieNode* root = new trieNode;
        string s;
        while (getline(cin, s)){
            if (!s.empty()){
                insertTrie(root, s);
            }
            else{
                showTrie(root);
                while (getline(cin, s)){
                    if (s.empty()) return 0;
                    cout << searchTrie(root, s) << endl;
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    git 更新代码
    jmeter 线程组之间传递动态变化的变量值
    MYSQL 使用存储过程批量更新表数据
    linux查看日志中特定字符串以及前后信息内容命令
    导出表结构 字段说明
    转 awk统计nginx每天访问最高的接口
    MySQL 同一字段匹配多个值
    Can't connect to local MySQL server through socket '/opt/lampp/var/mysql/mysql.sock' (2)
    转 Xshell ssh长时间连接不掉线设置
    Vs.net 常用命令行
  • 原文地址:https://www.cnblogs.com/jokoz/p/4768376.html
Copyright © 2011-2022 走看看