圖論 - Trie樹(字符串統計、最大異或對)

文章目錄

  • 前言
  • Part 1:Trie字符串統計
    • 1.題目描述
        • 輸入格式
        • 輸出格式
        • 數據范圍
        • 輸入樣例
        • 輸出樣例
    • 2.算法
  • Part 2:最大異或對
    • 1.題目描述
        • 輸入格式
        • 輸出格式
        • 數據范圍
        • 輸入樣例
        • 輸出樣例
    • 2.算法

前言

本篇博客將介紹Trie樹的常見應用,包括:Trie字符串統計、最大異或對。首先,我們要知道Trie樹是什么?

Trie樹:是一種多叉樹的結構,每個節點保存一個字符,一條路徑表示一個字符串。例子:下圖表示了字符串: him 、 her 、 cat 、 no 、 nova 構成的 Trie 樹在這里插入圖片描述

Part 1:Trie字符串統計

1.題目描述

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

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

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

輸入格式

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

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

輸出格式

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

每個結果占一行。

數據范圍

1≤N≤2?104

輸入樣例
5
I abc
Q abc
Q ab
I ab
Q ab
輸出樣例
1
0
1

2.算法

  • 用數組來模擬Trie樹
    在這里插入圖片描述
#include <iostream>using namespace std;const int N = 100010;
//son[][]存儲子節點的位置,分支最多26條;
//cnt[]存儲以某節點結尾的字符串個數(同時也起標記作用)
//idx表示當前要插入的節點是第幾個,每創建一個節點值+1
int son[N][26], cnt[N], idx;
char str[N];//插入字符串
void insert(char *str)
{int p = 0;  //類似指針,指向當前節點for(int i = 0; str[i]; i++){int u = str[i] - 'a'; //將字母轉化為數字if(!son[p][u]) son[p][u] = ++idx;   //該節點不存在,創建節點p = son[p][u];  //使“p指針”指向下一個節點}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]) return 0;  //該節點不存在,即該字符串不存在p = son[p][u]; }return cnt[p];  //返回字符串出現的次數
}int main()
{int m;cin >> m;while(m--){char op[2];scanf("%s%s", op, str);if(*op == 'I') insert(str);else printf("%d\n", query(str));}return 0;
}

Part 2:最大異或對

1.題目描述

在給定的 N 個整數 A1,A2……AN 中選出兩個進行 xor(異或)運算,得到的結果最大是多少?

輸入格式

第一行輸入一個整數 N。

第二行輸入 N 個整數 A1~AN。

輸出格式

輸出一個整數表示答案。

數據范圍

1≤N≤105,
0≤Ai<231

輸入樣例
3
1 2 3
輸出樣例
3

2.算法

  • 字典樹不單單可以高效存儲和查找字符串集合,還可以存儲二進制數字
  • 將每個數以二進制方式存入字典樹,找的時候從最高位去找有無該位的異
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;
//保存 Trie 樹
int son[N * 31][2];  
int n, idx;void insert(int x)
{int p = 0;//初始化指向根節點//從最高位開始,依次取出每一位for (int i = 31; i >= 0; i--){   // 取出當前位int u = x >> i & 1;//如果樹中不能走到當前數字//為當前數字創建新的節點,保存該數字if (!son[p][u])// 新節點編號為 idx + 1son[p][u] = ++idx; p = son[p][u];}
}int query(int x)
{//指向根節點int p = 0;// 保存與 x 異或結果最大的那個數int ret = 0;//從最高位開始,依次取出 x 的每一位for (int i = 31; i >= 0; i--){// 取出 x 的當前位int u = x >> i & 1;//如果樹中能走到 !u,就走到!uif (son[p][!u]){//走到!up = son[p][!u];//更新 x 異或的對象ret = ret * 2 + !u;}  //沒有!u,就只能走到u了else{p = son[p][u];//更新 x 異或的對象ret = ret * 2 + u; }}//計算異或結果ret = ret ^ x;return ret;
}int main()
{cin >> n;int maxXorNum = 0; int x;for (int i = 0; i < n; i++){cin >> x;insert(x);maxXorNum = max(maxXorNum, query(x));}cout << maxXorNum << endl;return 0;
}

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

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

相關文章

C++ 使用 nlohmann::json存儲json文件

C 使用 nlohmann::json存儲json文件 nlohmann::json 概述JSON 存儲的示例以追加的方式存儲json文件 nlohmann::json 概述 nlohmann::json 是 C 中一個流行的 JSON 庫&#xff0c;由 Niels Lohmann 開發。它提供了一個簡單而強大的 API&#xff0c;用于解析、構建、操作和序列化…

電子電氣架構——車載以太網協議棧

電子電氣架構——車載以太網協議棧 我是穿拖鞋的漢子&#xff0c;魔都中堅持長期主義的汽車電子工程師。 老規矩&#xff0c;分享一段喜歡的文字&#xff0c;避免自己成為高知識低文化的工程師&#xff1a; 沒有人關注你。也無需有人關注你。你必須承認自己的價值&#xff0c…

MySQL入門------數據庫與SQL概述

目錄 前言 一、數據庫相關概念 二、數據模型 1.關系型數據庫&#xff08;RDBMS&#xff09; 三、MySQL數據庫 1.下載和安裝 2.配置環境變量 四、SQL 1.SQL通用語法 2.SQL分類 前言 從本期開始&#xff0c;我們開始學習數據庫的相關理論和實踐知識&#xff0c;從入門…

jupyter 用pyecharts進行數據分析

一、jupyter和pyecharts下載和打開 因為我是用的pycharm&#xff0c;所以我直接在pycharm項目終端中下載pip install jupyter,pip install pyecharts 在你下載的項目路徑中輸入jupyter notebook 之后會進入頁面 Jupyter 具體使用參考這個鏈接&#xff1a;Jupyter Notebook基本…

Pygame教程01:初識pygame游戲模塊

Pygame是一個用于創建基本的2D游戲和圖形應用程序。它提供了一套豐富的工具&#xff0c;讓開發者能夠輕松地創建游戲和其他圖形應用程序。Pygame 支持許多功能&#xff0c;包括圖像和聲音處理、事件處理、碰撞檢測、字體渲染等。 Pygame 是在 SDL&#xff08;Simple DirectMed…

常用設計模式詳解

設計模式 1.UML圖 統一建模語言是用來設計軟件的可視化建模語言。定義了用例圖、類圖、對象圖、狀態圖、活動圖、時序圖、協作圖、構件圖、部署圖等 9 種圖。 1.1類圖 1.1.1類的表示方式 在UML類圖中&#xff0c;類使用包含類名、屬性(field) 和方法(method) 且帶有分割線…

基本正則表達式

基本正則表達式 正則命令功能&#xff3e;尖角號&#xff0c;用于模式的最左側&#xff0c;如“^oldbpy"&#xff0c;匹配以oldboy單詞開頭的行$美元符&#xff0c;用于模式的最右側&#xff0c;如"oldboy$"&#xff0c;表示以oldboy單詞結尾的行^$組合符&…

Java基于springboot的廚藝交流平臺的設計與實現代碼

摘 要 使用舊方法對廚藝交流信息進行系統化管理已經不再讓人們信賴了&#xff0c;把現在的網絡信息技術運用在廚藝交流信息的管理上面可以解決許多信息管理上面的難題&#xff0c;比如處理數據時間很長&#xff0c;數據存在錯誤不能及時糾正等問題。 這次開發的廚藝交流平臺功…

如何優雅的刪除undo表空間

前言 因磁盤空間不足&#xff0c;需要將undo表空間遷移到其它的存儲空間 本文介紹如何優雅的刪除undo表空間&#xff0c;并在新的存儲空間中創建新的undo表空間 詳細操作步驟如下&#xff1a; 1、查看默認undo表空間 SQL>show parameter undo NAME …

Redis的主從搭建

1.準備兩臺機器&#xff0c;安裝好redis 2.修改從服務器的redis配置 slaveof <masterip> <masterport>兩個參數 masterip 主的ip 主的端口號 masterport 3. 啟動redis 1.先啟動主機redis 2.再啟用從機redis 主機redis日志打印 從機redis 日志打印

【python】1.python3.12.2和pycharm社區版的安裝指南

歡迎來CILMY23的博客喔&#xff0c;本篇為【python】1.python3.12.2和pycharm社區版的安裝指南&#xff0c;感謝觀看&#xff0c;支持的可以給個一鍵三連&#xff0c;點贊關注收藏。 目錄 一、python3.12.2的下載與安裝 1.1下載 1.2安裝 二、pycharm的安裝 2.1下載安裝 2…

Bootstrap的使用

目錄 js的引入&#xff1a; 1.行內式 2.嵌入式 3.外鏈式 Bootstrap:的引入 注意事項&#xff1a; 條件注釋語句&#xff1a; 柵格系統&#xff1a; 列嵌套&#xff1a; 列偏移&#xff1a; 列排序&#xff1a; 響應式工具&#xff1a; Bootstrap的字體圖標的使用&a…

2024最新算法:河馬優化算法(Hippopotamus optimization algorithm,HO)求解23個基準函數,提供MATLAB代碼

一、河馬優化算法 河馬優化算法&#xff08;Hippopotamus optimization algorithm&#xff0c;HO&#xff09;由Amiri等人于2024年提出&#xff0c;該算法模擬了河馬在河流或池塘中的位置更新、針對捕食者的防御策略以及規避方法。河馬優化算法的靈感來自河馬生活中觀察到的三…

【金三銀四】Mysgl優化了解?什么情況下會導致SQL索引失效?如何寫出高效SQL與優化慢SQL

Mysgl優化 MySQL 優化是指對 MySQL 數據庫的配置、表設計、查詢語句等進行針對性的優化&#xff0c;以提高數據庫的性能和效率。這包括但不限于合理設計數據庫表結構、編寫高效的 SQL 查詢語句、創建合適的索引以及調整數據庫服務器的參數等。 當MySQL單表記錄數過大時&#xf…

【測試工具】Fiddler

1.Fiddler簡介 Fiddler是位于客戶端和服務器端的HTTP代理&#xff0c;能夠記錄客戶端和服務器之間的所有 HTTP請求&#xff0c;是web調試的利器。既然是代理&#xff0c;也就是說&#xff1a;客戶端的所有請求都要先經過Fiddler&#xff0c;然后轉發到相應的服務器&#xff0c…

【應用多元統計分析】--數據矩陣及R語言表示

在多元分析中&#xff0c;數據通常以矩陣的形式出現&#xff0c;下面結合R語言介紹基本的矩陣運算。主要包括&#xff1a;創建矩陣向量&#xff0c;矩陣加減、乘積&#xff0c;矩陣的逆&#xff0c;行列式的值&#xff0c;特征值與特征向量&#xff0c;QR分解&#xff0c;奇異值…

微前端-乾坤《》

微前端 一個應用&#xff0c;當不斷迭代的時候&#xff0c;功能會越來越多&#xff0c;代碼量隨著也會變得越來越大。進而代碼之間的耦合性會變高&#xff0c;這樣導致開發和維護很糟心&#xff0c;動一發而牽全身。于是有了微前端來解這個問題&#xff0c;按功能可以將這個應…

day02-JavaScript-Vue

文章目錄 1 JavaScript1.1 介紹 1.2 引入方式1.3 基礎語法1.3.1 書寫語法1.3.2 變量1.3.3 數據類型和運算符 1.4 函數1.4.1 第一種定義格式1.4.2 第二種定義格式 1.5 JavaScript對象1.5.1 基本對象1.5.1.1 Array對象語法格式特點屬性和方法 1.5.1.2 String對象語法格式屬性和方…

17.來自Sora的奪舍妄想——享元模式詳解

OpenAI 的 Sora 模型面世之后&#xff0c;可以說人類抵御AI的最后陣地也淪陷了。 在此之前&#xff0c;人們面對AI交互式對話&#xff0c;AI制圖&#xff0c;AI建模之類的奇跡時&#xff0c;還可以略微放肆的說&#xff1a;“的確很神奇&#xff0c;這畢竟還是比人類世界低了一…

Redis基本知識

一、什么是Redis Redis是一種基于內存的數據庫&#xff0c;對數據的讀寫操作都是在內存中完成&#xff0c;因此讀寫速度非常快&#xff0c;用于存儲鍵值對、緩存、消息隊列、分布式鎖等。 二、Redis和mencached的區別 相同&#xff1a;都是基于內存的數據庫&#xff0c;讀寫都…