首页 > 其他分享 >AcWing 835. Trie字符串统计

AcWing 835. Trie字符串统计

时间:2023-12-04 14:44:06浏览次数:33  
标签:idx 835 Trie son int str 字符串 节点 AcWing

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

原题链接:835. Trie字符串统计 - AcWing

Trie字典树[1]

//输入:
I dog
I dot
//此时的树为:
    d
    |
    o
   / \
  g   t
[1]   [1]
  • 简单的说,就是每条分支存储不同的单词,叶子节点cnt为该条分支上单词出现的次数。
    两个不同单词的相同前缀走同一条路径,当遇到不同单词时,路径分离。
    每个节点最多可以拥有26个子节点(\(a~z\))。

  • son数组存储着目前节点的下一节点
    第一维为当前节点的标号;
    第二维为下一节点的字母映射。

  • idx代表着每个节点的标号
    因为idx每出现一个新节点就自增一次,也就说明每个cnt[idx]都是唯一确定的。

#include <bits/stdc++.h>
using namespace std;

const int N = 100010;
int son[N][26], cnt[N], idx;

void insert(string str) {
	int p = 0;	//当前节点指针
	for (int i = 0; str[i]; i++) {
		int j = str[i] - 'a';	//字母映射为序号
		if (!son[p][j])			//当前子节点不存在
			son[p][j] = ++idx;	//节点持续自增
		p = son[p][j];			//更新指针
	}
	cnt[p]++;	//统计以此节点结束的字符串个数
}

int query(string str) {
	int p = 0;
	for (int i = 0; str[i]; i++) {
		int j = str[i] - 'a';
		if (!son[p][j])	//若不存在该词语,返回0
			return 0;
		else
			p = son[p][j];	//否则往下继续走
	}
	return cnt[p];
}

int main()
{
	int t;
	char op;
	string str;
	cin >> t;
	while (t--) {
		cin >> op >> str;
		if (op == 'I')	insert(str);
		else cout << query(str) << endl;
	}
}

  1. 字典树(Trie)_哔哩哔哩_bilibili ↩︎

标签:idx,835,Trie,son,int,str,字符串,节点,AcWing
From: https://www.cnblogs.com/haruhomu/p/17874869.html

相关文章

  • AcWing 831. KMP字符串
    题面:给定一个字符串S,以及一个模式串P,所有字符串中只包含大小写英文字母以及阿拉伯数字。模式串P在字符串S中多次作为子串出现。求出模式串P在字符串S中所有出现的位置的起始下标。原题链接:831.KMP字符串-AcWing核心:next数组-最长相等前后缀next[i]存储......
  • AcWing 92. 递归实现指数型枚举
    题面:从\(1∼n\)这\(n\)个整数中随机选取任意多个,输出所有可能的选择方案(求子集)。原题链接:92.递归实现指数型枚举-AcWing目录:使用dfs树的解法使用二进制与状态压缩的解法1.使用dfs树的解法层级既代表递归深度也代表当前数字,左子树为选该层数字,右子树为不选。#i......
  • AcWing 842. 排列数字 && AcWing 843. n-皇后问题
    842.排列数字(全排列)题面:给定一个整数\(n\),将数字\(1∼n\)排成一排,将会有很多种排列方法。现在,请你按照字典序将所有的排列方法输出。#include<iostream>usingnamespacestd;constintN=10;intpath[N];//保存序列boolst[N];//数字是否被用过,bool类型的全局变......
  • AcWing 828. 模拟栈
    题面:实现一个栈,栈初始为空,支持四种操作:pushx–向栈顶插入一个数\(x\);pop–从栈顶弹出一个数;empty–判断栈是否为空;query–查询栈顶元素。现在要对栈进行\(M\)个操作,其中的每个操作\(3\)和操作\(4\)都要输出相应的结果。原题链接:828.模拟栈-AcWing//......
  • AcWing 3302. 表达式求值
    题面:给定一个表达式,其中运算符仅包含加减乘除,可能包含括号,请你求出表达式的最终值。原题链接:3302.表达式求值-AcWing基本思路创建两个栈,分别存储数字和运算符运算符的判定:仅在以下条件满足时将运算符直接压入栈中:①栈中不存在元素②当前运算符优先级比栈顶高③栈顶为......
  • AcWing 154. 滑动窗口
    题面:给定一个大小为\(n≤10^6\)的数组。有一个大小为\(k\)的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到\(k\)个数字。每次滑动窗口向右移动一个位置。你的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。原题链接:154.滑动窗口-AcWing......
  • AcWing 785. 快速排序
    题面:给定你一个长度为\(n\)的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。原题链接:785.快速排序-AcWing需要注意的几个点:左右哨兵的发动顺序;相同元素的相对位置;边界划分问题[1]。#include<bits/stdc++.h>usingna......
  • AcWing 4. 多重背包问题
    题面:有\(N\)件物品和一个容量是\(V\)的背包。第\(i\)件物品最多有\(s_i\)件,每件体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使这些物品的体积总和不超过背包容量,且价值总和最大。输出最大价值。原题链接:4.多重背包问题I-AcWing多重背包实际上沿......
  • AcWing 5. 多重背包问题 II
    题面:有\(N\)件物品和一个容量是\(V\)的背包。第\(i\)件物品最多有\(s_i\)件,每件体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使这些物品的体积总和不超过背包容量,且价值总和最大。输出最大价值。原题链接:5.多重背包问题II-AcWing先前的思路[1]:将......
  • AcWing 3. 完全背包问题
    题面:有\(N\)种物品和一个容量是\(V\)的背包,每种物品都有无限件可用。第\(i\)种物品的体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。原题链接:3.完全背包问题-AcWing根据01背包的思路扩......