Acwing.835 Trie字符串统计 (trie数据结构)

题目

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

输入格式

第一行包含整数N,表示操作数。
接下来N行,每行包含一个操作指令,指令为"L×"或"Qx"中的一种。

输出格式

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

数据范围

1 ≤ N ≤ 2 ∗ 1 0 4 1 \le N \le 2*10^4 1N2104

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

题解

import java.util.Scanner;

/**
 * @author akuya
 * @create 2023-06-27-11:29
 */
public class Trie {
    static int N=100010;
    static int n,idx=0;
    static int son[][]=new int[N][26];
    static int cnt[]=new int [N];

    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        n=scanner.nextInt();
        while(n--!=0){
            String op=scanner.next();
            String str=scanner.next();
            if(op.equals("I"))insert(str);
            if(op.equals("Q")) System.out.println( query(str));;

        }

    }

    public static void insert(String s){
        int p=0;
        char str[]=s.toCharArray();
        for(int i=0;i<str.length;i++){
            int u=str[i]-'a';
            if(son[p][u]==0)son[p][u]=++idx;
            p=son[p][u];
        }

        cnt[p]++;
    }

    public static int query(String s){
        int p=0;
        char str[]=s.toCharArray();
        for(int i=0;i<str.length;i++){
            int u=str[i]-'a';
            if(son[p][u]==0) return 0;
            p=son[p][u];
        }

        return cnt[p];

    }


}

思路

本题为点播学习trie树的结构,何为trie的树,以下图片为模板:Acwing.835 Trie字符串统计 (trie数据结构)_第1张图片

你可能感兴趣的:(java算法实录,数据结构,java,算法)