Trie樹的應用

Trie樹的應用

  • 題目
    • 解題思路
    • 代碼

題目

維護一個字符串集合,支持兩種操作:

  1. I x 向集合中插入一個字符串 x x x
  2. Q x 詢問一個字符串在集合中出現了多少次。

共有 N N N 個操作,所有輸入的字符串總長度不超過 1 0 5 10^5 105,字符串僅包含小寫英文字母。

輸入格式

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

接下來 N N N 行,每行包含一個操作指令,指令為 I xQ x 中的一種。

輸出格式

對于每個詢問指令 Q x,都要輸出一個整數作為結果,表示 x x x 在集合中出現的次數。

每個結果占一行。

數據范圍

KaTeX parse error: Undefined control sequence: \* at position 14: 1 \le N \le 2\?*?10^4

輸入樣例:

5
I abc
Q abc
Q ab
I ab
Q ab

輸出樣例:

1
0
1

解題思路

這個題需要我們創建一個trie樹來解決問題。

假設我們需要插入的兩個字符串是 abc 和 abdef,此時樹就長這個樣子。
在這里插入圖片描述

假設再插入一個 abdf,那么就變成這個樣子

在這里插入圖片描述

本題還需要能夠查詢 一個字符串中出現的次數

所以在每次插入一個字符串時,都需要在末尾的字母處標記,具體怎么操作的還需要結合一下代碼

代碼

首先準備階段如下:
在這里插入圖片描述

其中 數組 son每一行代表 一個節點,每一行當中的列代表著 他是 a b c … z 中的哪一種字母,它存儲的值,是他的兒子,也就是它的下一個節點的位置,如果值是0的話則代表它沒有兒子。

idx代表著現在數組 son 用到那個點了。

數組cnt 用來標記每一個字符串出現了多少次。

數組str 用來臨時存儲要插入的字符串。


插入函數:

在這里插入圖片描述
參數為一個字符串,寫成數組和 指針的形式都可以。

這個p的含義是 數組son 的行數,也就是表示節點的位置。

p = 0代表當前 為 根節點。

在這里插入圖片描述

接下來遍歷整個字符串,拿到字符串的每一個字母所對應的每一行的列坐標(比如 a對應 0下標,b對應 1下標)

在這里插入圖片描述
這句話的意思是,如果此時沒有該處沒有被插入值也就是為0時,那么此時就創建一條路,給他個兒子節點,這個兒子的位置由 idx 決定,Idx的一生會從 1 開始 加加,作為每次插入點的坐標。

在這里插入圖片描述
接著 p 更新到它兒子節點的位置。

在這里插入圖片描述

最后在 數組cnt p位置上 自增1。

至此插入操作就完成了。


接著寫查詢函數。
在這里插入圖片描述

同樣,與插入的前面部分相同,u 是字符串中字母所對應的下標
在這里插入圖片描述
與前面不同的點是,插入操作是 沒路創造路,而查詢操作是 沒路則代表他這個字符串就不存在,所以就出現了0次,所以返回0.

在這里插入圖片描述
接著還是 指到下一個節點

最后遍歷完之后,如果沒有被 return 0,那么此時 cnt[ p ] 的值就是 該字符串出現的 次數。


接著是main函數部分
在這里插入圖片描述
main函數我們只需要根據題目當中的輸入和輸出,然后調用對應的方法即可。

完整代碼:

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45343.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45343.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45343.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ArkTS學習筆記_封裝復用之@builderParam裝飾器

ArkTS學習筆記_封裝復用之builderParam裝飾器 作用&#xff1a; 在自定義組件中&#xff0c;該裝飾器用于裝飾函數成員變量&#xff0c;builderParam裝飾的函數成員變量的值必須是經過builder裝飾的方法。變量初始化后可以在自定義組件內調用。初始化&#xff1a; 可以使用自定…

移動應用性能關注分析哪些指標

移動應用常見性能指標 要對應用開展性能測試&#xff0c;首先需要了解需要重點關注哪些指標&#xff1f;指標的參考范圍大致是多少&#xff1f;可采用哪些工具收集這些指標&#xff1f;如何收集&#xff1f;如果指標有異常&#xff0c;大致有哪些high level的優化思路。這篇博客…

說一下GET請求和POST請求的區別

面試官常常會問到的一個問題就是&#xff1a;GET請求和POST請求的區別。因為一個看似簡單的問題就能考察出面試者對網絡協議和通信的掌握程度以及對前后端開發基礎知識是否了解、安全性意識是否足夠強&#xff0c;以及綜合分析與總結能力等。 所以答的好可以讓面試官對你刮目相…

YoloV8改進策略:卷積篇|Kan行天下之GRAM,KAN遇見Gram多項式V2版本

GRAM(GRAM可能是一個新提出的模型或方法的縮寫,這里我們根據上下文進行解釋)受到諸如TorchKAN和ChebyKAN等Kolmogorov-Arnold網絡(KAN)替代方案的啟發。GRAM引入了一種簡化的KAN模型,但同時利用了Gram多項式變換的簡單性。它與其他替代方案的不同之處在于其獨特的離散性特…

Vue3 使用emoji表情包 emoji-mart-vue-fast

文檔&#xff1a;emoji-mart-vue-fast - npm (npmjs.com) 非常簡單 代碼直接照抄即可 1. 引入 pnpm install emoji-mart-vue-fast 2. 使用 <template><Picker:data"emojiIndex":emojiSize"18":showPreview"false":infiniteScroll&quo…

【07】分布式事務解決方案

1、事務簡介 事務(Transaction)是訪問并可能更新數據庫中各種數據項的一個程序執行單元(unit)。在關系數據庫中&#xff0c;一個事務由一組SQL語句組成。事務應該具有ACID四個特性&#xff1a;原子性、一致性、隔離性、持久性。任何事務機制在實現時&#xff0c;都應該考慮事務…

J025_斗地主游戲案例開發(簡版)

一、需求描述 完成斗地主游戲的案例開發。 業務&#xff1a;總共有54張牌&#xff1b; 點數&#xff1a;3、4、5、6、7、8、9、10、J、Q、K、A、2 花色&#xff1a;黑桃、紅桃、方片、梅花 大小王&#xff1a;大王、小王 點數分別要組合4種花色&#xff0c;大小王各一張。…

[激光原理與應用-114]:南京科耐激光-激光焊接-焊中檢測-智能制程監測系統IPM介紹 - 18 - 產品宣傳、介紹、產品價值、幫助客戶解決的問題

目錄 一、第一印象 1.1 我是誰&#xff1f;產品是什么&#xff1f;產品在產業鏈中的位置 1.2 公司在產業鏈中的位置&#xff1f;公司簡介&#xff1f; 二、IPM工作原理 2.1 IPM系統組成 2.2 基于激光熔池光學檢測原理 2.3 基于信號特征的檢測原理 三、IPM產品如何與客…

2-17,18,19 -- 關于指針

指針(pointer 聲明指針 int *p;定義指針 int a 4; int *p &a; //指針p是指向變量a的地址的指針指針數組 int *arr[5];數組指針 int (*arr)[5];函數指針 int (*fun)(int,int) // 聲明一個指向函數的指針,這個函數的返回值是int,有兩個int的參數指針的指針 int **p;…

ArkTS學習筆記_封裝復用之@Styles裝飾器

ArkTS學習筆記_封裝復用之Styles裝飾器 背景&#xff1a; 在開發中&#xff0c;如果每個組件的樣式都需要單獨設置&#xff0c;就會出現大量代碼在進行重復樣式設置&#xff0c;雖然可以復制粘貼&#xff0c;但為了代碼簡潔性和后續方便維護&#xff0c;給出的思路是&#xff…

jmeter分布式(四)

一、gui jmeter的gui主要用來調試腳本 1、先gui創建腳本 先做一個腳本 演示&#xff1a;如何做混合場景的腳本&#xff1f; 用211的業務比例 ①啟動數據庫服務 數據庫服務&#xff1a;包括mysql、redis mysql端口默認3306 netstat -lntp | grep 3306處于監聽狀態&#xf…

深入了解MySQL中的innodb_lock_wait_timeout

引言 在數據庫管理中&#xff0c;確保數據的一致性和完整性是至關重要的。MySQL的InnoDB存儲引擎通過行級鎖定機制來實現這一點。然而&#xff0c;當多個事務同時操作數據庫時&#xff0c;可能會出現鎖等待的情況。了解并合理配置innodb_lock_wait_timeout參數&#xff0c;對于…

數據庫第6次作業

內容 1、創建視圖v_emp_dept_id_1&#xff0c;查詢銷售部門的員工姓名和家庭住址 2、創建視圖v_emp_dept&#xff0c;查詢銷售部門員工姓名和家庭住址及部門名稱。 3、創建視圖v_dept_emp_count(dept_name,emp_count,avg_salay)&#xff0c;統計每個部門人數并計算平均工資。 …

Spring 使用log4j

porn.xml 引入依賴 <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.23.1</version></dependency><dependency><groupId>org.apache.logging.log4j<…

解讀網傳《深圳IT圈?新解讀八小時工作制》

網傳深圳IT圈的新解讀八小時工作制 工作時間安排&#xff1a; 10:00-12:0014:00-18:0019:00-21:00 初看&#xff1a;有驚喜 上午開始時間晚&#xff1a;相對于傳統的9點開始&#xff0c;這種安排允許員工有更多的早晨時間&#xff0c;可以用來休息或處理個人事務。下午和晚上分…

typescript新規范及vue3常用的屬性解析【2024】

文章目錄 如在vue中 使用tyescript來規范定義類型解釋一下 < >的意思 定義 了 personList &#xff1a;是個數組 Array 且要告訴里面每一項 結構長什么樣 Array<PersonInter>definepropsvue3中的hooks組件父子組件 方法、數據、相互調用 如在vue中 使用tyescript來…

【LSTM和GRU極簡,和最新的TT也就是狀態】機器學習模型來學習狀態

LSTM&#xff08;長短期記憶網絡&#xff09;中的關鍵參數包括輸入門、遺忘門、輸出門、細胞狀態和隱藏狀態。以下是如何進行推理計算的示例&#xff1a; LSTM參數和公式 輸入門&#xff08;i_t&#xff09;&#xff1a;決定輸入的信息量。 遺忘門&#xff08;f_t&#xff0…

【React Native】做了一個簡約的雷達圖組件

本文目錄 【React Native】做了一個簡約的雷達圖組件獲取組件實現思路用法示例簡易用法自定義美化 結語 【React Native】做了一個簡約的雷達圖組件 最近在使用 react-native 中需要繪制雷達圖&#xff0c;沒有找到合適的小組件&#xff08;大的圖表庫未直接提供&#xff0c;需…

pico+unity3d運行測試方法

一. 發布并運行程序 這個就很簡單&#xff0c;電腦和pico數據庫連接、pico打開開發者模式、運行的時候選擇設備pico 二. pico串流助手 1.需要先下載pico的軟件 PICO Developer Center、并安裝串流助手、這種方式的話&#xff0c;安裝了向日葵的小伙伴可能有沖突、百度一下解…

c#中的特性

在C#中&#xff0c;特性&#xff08;Attributes&#xff09;是一種向程序元素&#xff08;如類、方法、屬性等&#xff09;添加元數據的方式。特性可以用來提供關于程序元素的附加信息&#xff0c;這些信息可以在編譯時和運行時被訪問。 特性主要有以下幾個用途&#xff1a; 提…