zoukankan      html  css  js  c++  java
  • acwing 835. Trie字符串统计

    地址  https://www.acwing.com/problem/content/description/837/

    维护一个字符串集合,支持两种操作:

    1. “I x”向集合中插入一个字符串x;
    2. “Q x”询问一个字符串在集合中出现了多少次。

    共有N个操作,输入的字符串总长度不超过 105105,字符串仅包含小写英文字母。

    输入格式

    第一行包含整数N,表示操作数。

    接下来N行,每行包含一个操作指令,指令为”I x”或”Q x”中的一种。

    输出格式

    对于每个询问指令”Q x”,都要输出一个整数作为结果,表示x在集合中出现的次数。

    每个结果占一行。

    数据范围

    1N2104

    输入样例:
    5
    I abc
    Q abc
    Q ab
    I ab
    Q ab
    输出样例:
    1
    0
    1

    trie 树的模板题

    解法1 使用trie树解决

    #include <iostream>
    
    using namespace std;
    
    const int N = 100010;
    
    int son[N][26], cnt[N], idx;
    char str[N];
    
    void insert(char *str)
    {
        int p = 0;
        for (int i = 0; str[i]; i ++ )
        {
            int u = str[i] - 'a';
            if (!son[p][u]) son[p][u] = ++ idx;
            p = son[p][u];
        }
        cnt[p] ++ ;
    }
    
    int query(char *str)
    {
        int p = 0;
        for (int i = 0; str[i]; i ++ )
        {
            int u = str[i] - 'a';
            if (!son[p][u]) return 0;
            p = son[p][u];
        }
        return cnt[p];
    }
    
    int main()
    {
        int n;
        scanf("%d", &n);
        while (n -- )
        {
            char op[2];
            scanf("%s%s", op, str);
            if (*op == 'I') insert(str);
            else printf("%d
    ", query(str));
        }
    
        return 0;
    }

    解法2  使用哈希解决

    #include <iostream>
    #include <map>
    #include <string>
    
    using namespace std;
    
    map<string,int> re;
    
    
    
    
    const int N = 100010;
    
    int son[N][26], cnt[N], idx;
    char str[N];
    
    
    void insert(char str[]){
        re[str]++;
    }
    
    int query(char str[]){
        return re[str];
    }
    
    
    int main()
    {
          int n;
        scanf("%d", &n);
        while (n -- )
        {
            char op[2];
            scanf("%s%s", op, str);
            if (*op == 'I') insert(str);
            else printf("%d
    ", query(str));
        }
        
        return 0;
    }

    输入样例:

    5
    I abc
    Q abc
    Q ab
    I ab
    Q ab
    

    输出样例:

    1
    0
    1
    
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    mysql数据库 详解
    0810 smarty
    抽象类
    Nginx 负载均衡策略
    Nginx 负载均衡配置和策略
    内置Web Server
    PHP运行方式
    MySQL create table 语法
    MySQL 索引的使用
    MySQL的 explain 解析
  • 原文地址:https://www.cnblogs.com/itdef/p/11576825.html
Copyright © 2011-2022 走看看