Trie树(1.字符串统计____2.最大异或对求解)

Trie树

文章目录

  • Trie树
      • Trie字符串统计
        • 正解
      • 最大异或对
        • 1.暴力 (可以过6/10个测试点)
        • 2. Trie树模拟

用法:高效地存储和查找字符串集合的数据结构

存储形式: 将n个单词各个字符进行枚举,若是(根节点所指向包含字符c,那么直接相连接着写)

每个单词结尾处做一个标记,表示以当前节点结尾处有一个单词

在这里插入图片描述

Trie字符串统计

题目:

在这里插入图片描述

初步思路:想到用kmp来模拟暴力解,最终过去6/18个测试点 错误解法

#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e5 + 10;
int ne[N];
string str;
void getNext(char* t, int m) {
    ne[0] = -1;
    int j = 0, k = -1;
    while(j < m) {
        if(k == -1 || t[j] == t[k]) ne[++j] = ++k;
        else k = ne[k];
    }
}
int kmp(char* t, int n, int m) {
    int i = 0, j = 0, r = 0;
    while(i < n) {
        if(j == -1 || str[i] == t[j]) i++, j++;
        else j = ne[j];
    }
    if(j == m)  r++, j = ne[j];
    return r;
}
int main() {
    int n;
    char op, t[N];
    cin >> n;
    getchar();
    while(n --) {
        scanf("%c%s", &op, t);
        getchar();
        if(op == 'I')   str += t;
        else if(op == 'Q'){
            int n = str.size();
            int m = strlen(t);
            getNext(t, m);
            int res = kmp(t, n, m);
            printf("%d\n", res);
        }
    }
    return 0;
}
正解

用Trie树来存储字符串求解

#include <iostream>
using namespace std;
const int N = 100010;
//p代表节点,idx代表位置下标,cnt[p]代表以p节点结尾的所求字符串个数
int son[N][26]; //节点个数最多为N,只包含小写字母,故每个节点最多向往延伸出26条边
int cnt[N]; //以i节点结尾的字符串个数
int idx;    // 各个节点的编号,根节点编号为0
char str[N];

void insert(char str[]) {
    int p = 0;  //指向根节点
    for(int i = 0; str[i]; i++) {
        int t = str[i] - 'a';   //将[a,z] 映射到 [0,25]
        //如果数中不能走到当前字符
        //为当前字符创建新的节点,保存该字符
        if(!son[p][t]) son[p][t] = ++idx;    新节点编号为 idx + 1
        p = son[p][t];  //p指向对应idx位置
    }
    cnt[p]++;
}

int query(char str[]) {
    int p = 0;
    for(int i = 0; str[i]; i++) {
        int t = str[i] - 'a';
        if(!son[p][t])  return 0;
         //指向下一个节点
        p = son[p][t];
    }
    return cnt[p];
}

int main() {
    int n;
    cin >> n;
    while(n --) {
        char op[2];
        scanf("%s%s", op, str);
        if(op[0] == 'I')    insert(str);
        else printf("%d\n", query(str));
    }
    return 0;
}

最大异或对

在这里插入图片描述

思路

1.暴力 (可以过6/10个测试点)
#include <iostream>
using namespace std;
const int N = 100010;
int a[N];
int main() {
    int n;
    cin >> n;
    for(int i = 0; i < n; i++)  scanf("%d", &a[i]);
    int res = 0;
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            res = max(res, a[i]^a[j]);
    cout << res;
    return 0;
}
2. Trie树模拟

固定 A i A_i Ai,从 A 1 A_1 A1 ~ A n A_n An中选出最 A j A_j Aj,使得 A i ∗ A j A_i * A_j AiAj最大

A i A_i Ai = 11010101010…….(32位),尽量保证选区的数从左到右相异(这样可以保证结果为1,最大)

在这里插入图片描述

在这里插入图片描述

代码如下:

//用Trie树来解的话,最多有1e5个数,每个数最多有31位,故最多有1e5*31个节点(而且肯定比这小,有重复节点)
#include <iostream>
using namespace std;
const int N = 3000000, M = 100010;
int son[N][2];  //延伸出只有0/1两种选择
int a[N], idx;
void insert(int x) {
    int p = 0;
    for(int i = 30; i >= 0; i--) {  //向右移动i位,从左往右第i位(从0开始)
        if(!son[p][x >> i & 1]) son[p][x >> i & 1] = ++idx;
        p = son[p][x >> i & 1];
    }
}

int query(int x) {
    int p = 0, res = 0;
    for(int i = 30; i >= 0; i--) {
        int u = x >> i & 1; //第i位
        if(son[p][!u]) {   //找到与u不同的位数节点,这样才能保证异或的答案最大(1)
            res += 1 << i;  //如果有这样的节点可以选择,那么答案的当前位置(第i位为1)
            p = son[p][!u];
        } else {    //没有上边的更优的节点选择的话,那么退而求其次,当前位置就为0了,答案不用累加了也
            p = son[p][u];
        }
    }
    return res;
}

int main() {
    int n;
    cin >> n;
    for(int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
        insert(a[i]);
    }
    int res = 0;
    for(int i = 0; i < n; i++)  res = max(res, query(a[i]));
    cout << res;
    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/424799.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【javaSE-语法】lambda表达式

【javaSE-语法】lambda表达式 1. 先回忆一下&#xff1a;1.1 接口不能直接通过关键字new进行实例化1.2 函数式接口1.3 匿名内部类1.31 匿名内部类在代码中长啥样&#xff1f;1.32 构造一个新的对象与构造一个扩展了某类的匿名内部类的对象&#xff0c;两者有什么区别&#xff1…

基于vue-office实现docx、xlsx、pdf文件的在线预览

概述 在做项目的时候会遇到docx、xlsx、pdf等文件的在线预览需求&#xff0c;实现此需求可以有多种解决方式&#xff0c;本文基于vue-office实现纯前端的文件预览。 效果 如下图&#xff0c;分别为docx、xlsx、pdf三种类型的文件在线加载后的效果。你也可以访问官方预览网址…

【CSP试题回顾】202312-2-因子化简

CSP-202312-2-因子化简 解题思路 本题要求实现的是素数分解&#xff0c;并检查每个素因子的指数是否大于等于k&#xff0c;满足条件则将其加入最终乘积中&#xff0c;最后输出这个乘积。如果没有任何素因子的指数大于等于k&#xff0c;则按照题目要求输出1。 输入测试用例数q&…

ESP32如何查看IIC等默认引脚?

在通过ESP32做项目的时候&#xff0c;用到了IIC&#xff0c;但是在查看芯片手册的时候&#xff0c;上面说又有引脚都可以作为IIC引脚 看到这个的时候&#xff0c;人麻了。当时只想着省事&#xff0c;想使用默认引脚&#xff0c;后来在寻找芯片库文件的时候&#xff0c;发现了&…

云计算与大数据课程笔记(一)云计算背景与介绍

如何实现一个简易搜索引擎&#xff1f; 实现一个简易的搜索引擎可以分为几个基本步骤&#xff1a;数据收集&#xff08;爬虫&#xff09;、数据处理&#xff08;索引&#xff09;、查询处理和结果呈现。下面是一个概括的实现流程&#xff1a; 1. 数据收集&#xff08;爬虫&am…

数据结构 - Trie树(字符串统计、最大异或对)

文章目录 前言Part 1&#xff1a;Trie字符串统计1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 Part 2&#xff1a;最大异或对1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 前言 本篇博客将介绍Trie树的常见应用&#xff0c;包括&#xff1a;Trie…

Java 中对包含关系的判断

本文将为您详细讲解 Java 中对包含关系的判断&#xff0c;包括数组、字符串等&#xff0c;并提供相应的代码例子。 1. 数组包含关系判断 在 Java 中&#xff0c;数组包含关系判断通常使用循环来实现。以下是几种常见的判断方法&#xff1a; 示例 1&#xff1a;使用 for…

机器学习中类别不平衡问题的解决方案

类别不平衡问题 解决方案简单方法收集数据调整权重阈值移动 数据层面欠采样过采样采样方法的优劣 算法层面代价敏感集成学习&#xff1a;EasyEnsemble 总结 类别不平衡&#xff08;class-imbalance&#xff09;就是指分类任务中不同类别的训练样例数目差别很大的情况 解决方案…

Linux虚拟文件系统管理技术

Linux虚拟文件系统管理技术 1. 虚拟文件系统的组成1.1 虚拟文件系统架构1.3 超级块(super block)1.4 索引节点(inode)1.4.1 inode怎样生成的?1.4.2 inode和文件的关系? 1.5 目录项(dentry)1.6 文件对象(file) 2. 进程与文件系统的关系3. 磁盘与文件系统的关系4. 常见的文件系…

基于springboot+vue的图书管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

测试面试精选题:可用性测试主要测试哪些方面,举例说明

1.界面设计&#xff1a; 评估软件的用户界面设计是否直观、美观、易于理解和操作。 测试用例&#xff1a;打开软件&#xff0c;查看界面布局是否合理&#xff0c;各个功能是否容易找到&#xff0c;是否符合用户习惯。 2.导航和布局&#xff1a; 评估用户在软件中导航和查找…

录制用户操作实现自动化任务

先上视频&#xff01;&#xff01; 流程自动化工具-录制操作绘制流程 这个想法之前就有了&#xff0c;趁着周末时间给它撸出来。 实现思路 从之前的文章自动化桌面未来展望中已经验证了录制绘制流程图的可行性。基于DOM录制页面操作轨迹的思路监听页面点击、输入事件即可&…

搭建 LNMP 架构

一 理论知识 &#xff08;一&#xff09;架构图 &#xff08;二&#xff09;CGI 由来 最早的Web服务器只能简单她响应浏览器发来的HTTP请求&#xff0c;并将存储在服务器上的HTML文件返回给浏览器&#xff0c;也就是静态html文件&#xff0c;但是后期随着网站功能增多网站开…

MATLAB基于隐马尔可夫模型-高斯混合模型-期望最大化的MR图像分割

隐马尔可夫模型是一种统计模型&#xff0c;它描述了马尔可夫过程&#xff0c;隐马尔可夫过程中包含隐变量&#xff0c;语音识别和词性自动标注等一些领域常常使用隐马尔可夫模型方法来处理。马尔可夫过程是一类随机过程&#xff0c;马尔可夫链是它的原始模型&#xff0c;马尔可…

Vue开发实例(一)Vue环境搭建第一个项目

Vue环境搭建&第一个项目 一、环境搭建二、安装Vue脚手架三、创建Vue项目 一、环境搭建 下载方式从官网下载&#xff1a;http://nodejs.cn/download/ 建议下载v12.16.0版本以上的&#xff0c;因为版本低无法创建Vue的脚手架 检验是否安装成功 配置环境变量 新增NODE_HOME&…

2024最新算法:冠豪猪优化算法(Crested Porcupine Optimizer,CPO)求解23个基准函数(提供MATLAB代码)

一、冠豪猪优化算法 冠豪猪优化算法(Crested Porcupine Optimizer&#xff0c;CPO)由Mohamed Abdel-Basset等人于2024年提出&#xff0c;该算法模拟冠豪猪的四种不同保护机制&#xff1a;视觉、听觉、气味和物理攻击。第一和第二防御技术&#xff08;视觉和听觉&#xff09;反…

论文阅读-CheckFreq:频繁、精细的DNN检查点操作。

论文名称&#xff1a;CheckFreq: Frequent, Fine-Grained DNN Checkpointing. 摘要 训练深度神经网络(DNNs)是一项资源密集且耗时的任务。在训练过程中&#xff0c;模型在GPU上进行计算&#xff0c;重复地学习权重&#xff0c;持续多个epoch。学习到的权重存在GPU内存中&…

地图资源工具新增 GEDI 2A 数据下载

GEDI 2A 是指"Global Ecosystem Dynamics Investigation 2A"&#xff0c;这是一项由美国宇航局 (NASA) 所发起的卫星任务。GEDI 2A 任务的目标是通过激光雷达技术来监测和理解全球生态系统的动态变化。该技术可以提供高精度的地形和植被结构数据&#xff0c;对于研究…

云上攻防-云原生篇Docker安全系统内核版本漏洞CDK自动利用容器逃逸

知识点 1、云原生-Docker安全-容器逃逸&内核漏洞 2、云原生-Docker安全-容器逃逸&版本漏洞 3、云原生-Docker安全-容器逃逸&CDK自动化 章节点&#xff1a; 云场景攻防&#xff1a;公有云&#xff0c;私有云&#xff0c;混合云&#xff0c;虚拟化集群&#xff0c…

CSM是什么意思?

CSM(Customer Service Management)是企业客户服务管理的信息化&#xff08;IT&#xff09;解决方案架构。本着以客户为中心的管理理念&#xff0c;搭建企业客户服务管理平台&#xff0c;实现企业以客户为中心的管理时代的竞争战略。 CSM的核心是以客户为中心&#xff0c;实现对…
最新文章