公告

👇 微信 👇

图片

欢迎私信交流

Skip to content

8-Trie树 ​

算法思想 ​

算法图解 ​

8-Trie树-1746253401027455278.png

算法模板 ​

java
import java.util.*;

public class Main {
    static int N = 100010;
    // 一个字母即为一个节点
    // son[i][] 存储第 i 个节点的子节点的索引(在 cnt 数组中的索引)
    // son[0] 为根节点,同时也是个空节点
    static int[][] son = new int[N][26];
    // cnt[i] 存储以第 i 个节点结尾的单词的数量
    static int[] cnt = new int[N];
    // idx 表示 cnt 数组当中最后一个已被使用的元素的索引
    // idx 初始化为0,表示 cnt 数组当中最后一个已被使用的元素的索引为 0
    static int idx = 0;
    
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        while(n -- > 0)
        {
            String op = in.next();
            var chars = in.next().toCharArray();
            if(op.equals("I"))
            {
                insert(chars);
            }
            else 
            {
                int res = query(chars);
                System.out.println(res);
            }
        }
    }
    
    static void insert(char[] chars)
    {
        int p = 0;
        for(char ch : chars)
        {
            int u = ch - 'a';
            if(son[p][u] == 0) son[p][u] = ++ idx;
            p = son[p][u];
        }
        cnt[p] ++; 
    }
    
    static int query(char[] chars)
    {
        int p = 0;
        for(char ch : chars)
        {
            int u = ch - 'a';
            if(son[p][u] == 0) return 0;
            p = son[p][u];
        }
        return cnt[p];
    }
}