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

news2024/9/24 11:32:08

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.coloradmin.cn/o/1483577.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第九讲-I/0 Interface

1. I/O接口 2. 程序查询I/O方式 3. 中断与中断l/O方式

即插即用篇 | YOLOv8 引入 DoubleAttention 注意力机制 | 《A2-Nets: Double Attention Networks》

论文名称:《A2-Nets: Double Attention Networks》 论文地址:https://arxiv.org/pdf/1810.11579.pdf 文章目录 1 原理2 源代码3 添加方式4 模型 yaml 文件template-backbone.yamltemplate-small.yamltemplate-large.yamltemplate-neck.yamlyolov8-C2

2024国际元宇宙博览会:阿里元境以元宇宙数字内容助力文旅数字化发展

2月26日&#xff0c;MES2024国际元宇宙博览会在深圳会展中心正式开幕&#xff0c;大会以“向3D出发&#xff0c;元宇宙来袭&#xff0c;电竞娱乐正当时”为主题&#xff0c;聚焦元宇宙产业链&#xff0c;以“汇聚企业创新&#xff0c;助力产业重构&#xff0c;推动行业发展”为…

【数学建模获奖经验】2023第八届数维杯数学建模:华中科技大学本科组创新奖获奖分享

2024年第九届数维杯大学生数学建模挑战赛将于&#xff1a;2024年5月10日08:00-5月13日09:00举行&#xff0c;近期同学们都开始陆续进入了备赛阶段&#xff0c;今天我们就一起来看看上一届优秀的创新奖选手都有什么获奖感言吧~希望能帮到更多热爱数学建模的同学。据说点赞的大佬…

数据库题专题训练(包含专题讲解+一整套题) 复试+升本比较适合

【拯救者】数据库题专题训练(包含专题讲解一整套题) 复试专升本期末 更新中 1️⃣ 先讲对应的专题 2️⃣ 最后来一整套模拟考题 &#x1f357;提供文档下载 【拯救者】Ep1_ER图专题(上) ​ ⭐️ 画ER图: 关注三个点 1. 找实体 2.找实体的属性 3.找实…

yolo目标检测实战

该博客主要介绍了&#xff1a; 1. 如何制作yolo目标检测数据集 2.如何在自己的数据集上训练yolo 3.训练好后的模型如何进行推理 1.数据标注 关于数据如何标注&#xff0c;请查看这篇博文 2.数据集目录结构 重点关注红框内部的结构 images: 图片目录 images/train: 训练集…

mysql根据指定顺序返回数据--order by field

在查询数据的时候&#xff0c;在in查询的时候&#xff0c;想返回的数据根据 in里的数据顺序返回&#xff0c;可以直接在orderby中通过 FIELD(字段名称逗号分隔的值的顺序) 进行指定&#xff1b;示例没有加 order by field添加 order by field效果

边缘智能网关:让环境监测更智能

在环境监测领域&#xff0c;边缘智能网关可用于区域环境的实时监测、分析和预警&#xff0c;例如河湖水位监测、雨雪监测、风沙/风速监测&#xff0c;通过实时采集并分析环境变化数据&#xff0c;能够有助于对于突发、急发的各种自然灾害进行快速预警和应对。 一、边缘智能网关…

JeecgBoot3.6.1 中打印功能实现

JeecgBoot3.6.1中实现打印功能 前言 在项目开发中我们可能会遇到打印得需求&#xff0c;基于JeecgBoot框架做了如下案例 一、前端 1、vue页面代码&#xff1a;List.vue <template><BasicTable register"registerTable" :rowSelection"rowSelectio…

【RT-Thread基础教程】邮箱的使用

文章目录 前言一、邮箱的特性二、邮箱操作函数2.1 创建邮箱创建动态邮箱创建静态邮箱 2.2 删除邮箱2.3 发邮件2.4 取邮件 三、示例代码总结 前言 RT-Thread是一个开源的实时嵌入式操作系统&#xff0c;广泛应用于各种嵌入式系统和物联网设备。在RT-Thread中&#xff0c;邮箱是…

【leetcode】 剑指 Offer学习计划(java版本含注释)(下)

目录 前言第十六天&#xff08;排序&#xff09;剑指 Offer 45. 把数组排成最小的数&#xff08;中等&#xff09;剑指 Offer 61. 扑克牌中的顺子&#xff08;简单&#xff09; 第十七天&#xff08;排序&#xff09;剑指 Offer 40. 最小的k个数&#xff08;简单&#xff09; 第…

【yolov8部署实战】VS2019环境下使用Onnxruntime环境部署yolo项目|含源码

一、前言 部署yolo项目&#xff0c;是我这几个月以来做的事情&#xff0c;最近打算把这几个月试过的方法&#xff0c;踩过的坑&#xff0c;以博客的形式&#xff0c;分享一下。关于下面动态中讲到的如何用opencv部署&#xff0c;我在上一篇博客中已经详细讲到了&#xff1a;【…

Unity(第二十三部)导航

你可以使用 unity官方提供的 unity导航组件或第三方 unity导航组件&#xff0c;以实现游戏中角色或其他物体的导航。 unity导航组件通常具有多种导航模式&#xff0c;如飞行模式、步行模式、车辆模式等&#xff0c;可以根据不同的需求选择合适的模式。同时&#xff0c;unity导…

【JSON2WEB】06 JSON2WEB前端框架搭建

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 前端技术路线太多了&#xff0c;知识点更多&…

【InternLM 实战营笔记】OpenCompass大模型评测

随着人工智能技术的快速发展&#xff0c; 大规模预训练自然语言模型成为了研究热点和关注焦点。OpenAI于2018年提出了第一代GPT模型&#xff0c;开辟了自然语言模型生成式预训练的路线。沿着这条路线&#xff0c;随后又陆续发布了GPT-2和GPT-3模型。与此同时&#xff0c;谷歌也…

leetcode 3.1

leetcode hot 100 双指针1.三数之和2.接雨水 多维动态规划1.最长公共子序列 双指针 1.三数之和 三数之和 排序 双指针的方法&#xff0c;固定一个数nums[i], 用两数和找target - nums[i] 的数需要注意两点: 1.需要去掉重复数字 while (l < r && nums[l] nums[…

2024年领取腾讯云优惠券的方法有哪些?程序员爆肝整理

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

如何自动化获取谷歌学术上学者的全部论文信息

如何自动化获取谷歌学术上学者的全部论文信息 在学术研究领域&#xff0c;追踪和分析学者的研究工作是非常重要的。本文介绍了如何使用Python自动化地收集指定学者的谷歌学术主页上的所有论文信息。 示例&#xff1a;施一公院士的谷歌学术主页 以施一公院士的谷歌学术主页为…

redis7.2.2|Dict

文章目录 StructredisDBdictdictTypedictEntry 宏定义散列函数散列冲突dictEntry pointer bit tricks[指针位技巧]API implementation_dictReset_dictInitdictCreatedictGetHashdictSetKeydictSetValdictSetNextdictGetNextdictGetValdictGetKey_dictCleardictEmptydictRelease…

Linux进程——信号详解(上)

文章目录 信号入门生活角度的信号技术应用角度的信号用kill -l命令可以察看系统定义的信号列表信号处理常见方式概述 产生信号通过键盘进行信号的产生&#xff0c;ctrlc向前台发送2号信号通过系统调用异常软件条件 信号入门 生活角度的信号 你在网上买了很多件商品&#xff0…