835. Trie字符串统计

摘要
Title: 835. Trie字符串统计
Tag: Trie
Memory Limit: 64 MB
Time Limit: 1000 ms

Powered by:NEFU AB-IN

Link

835. Trie字符串统计

  • 题意

    维护一个字符串集合,支持两种操作:
    I x 向集合中插入一个字符串 x;
    Q x 询问一个字符串在集合中出现了多少次。
    共有 N 个操作,输入的字符串总长度不超过 10^5,字符串仅包含小写英文字母。

  • 思路

    Trie字典树板子题

    高效地存储和查找字符串

  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    '''
    Author: NEFU AB-IN
    Date: 2022-02-28 23:16:38
    FilePath: \ACM\Acwing\835.py
    LastEditTime: 2022-02-28 23:32:18
    '''

    N = int(1e5 + 10)

    son = [[0] * 26 for _ in range(N)] # N代表最多有多少个结点,由于题目中说最多10^5个字符,所以1e5即可
    # 26代表结点的广度
    cnt, idx = [0] * N, 0


    def insert(s):
    global idx
    p = 0 #根节点,同时也是空节点
    for i in range(len(s)):
    u = ord(s[i]) - ord('a') #结点的字典序
    if not son[p][u]: #如果不存在
    idx += 1
    son[p][u] = idx #就创建
    p = son[p][u] #切换根,即往下走
    cnt[p] += 1 #尾部加1计数


    def query(s):
    p = 0
    for i in range(len(s)):
    u = ord(s[i]) - ord('a')
    if not son[p][u]: #如果不存在就返回0
    return 0
    p = son[p][u]
    return cnt[p]


    n = int(input())
    for i in range(n):
    op, s = input().split()

    if op == 'I':
    insert(s)
    else:
    print(query(s))
使用搜索:谷歌必应百度