Tire树

Trie 树是一种多叉树的结构,每个节点保存一个字符,一条路径表示一个字符串。

 

Trie字符串统计

维护一个字符串集合,支持两种操作:

  1. I x 向集合中插入一个字符串 x;
  2. Q x 询问一个字符串在集合中出现了多少次。

共有 N 个操作,所有输入的字符串总长度不超过 10^5,字符串仅包含小写英文字母。

输入格式

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

接下来 N 行,每行包含一个操作指令,指令为 I x 或 Q x 中的一种。

输出格式

对于每个询问指令 Q x,都要输出一个整数作为结果,表示 x 在集合中出现的次数。

每个结果占一行。

数据范围

1≤N≤2∗10^4

输入样例:

5
I abc
Q abc
Q ab
I ab
Q ab

输出样例:

1
0
1
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int son[N][26];//Tire 树本身 
int cnt[N];//cnt[x] 表示:以 编号为 x 为结尾的字符串的个数
int idx;//各个节点的编号 根节点的编号为0
int n;
void insert(string s)
{
    int p=0;//从根节点开始寻找
    for(int i=0;i<s.size();i++)
    {
        int t=s[i]-'a';
    //判断这个结点是否存在这个字母,如果不存在的话,新创一个结点存储该字母
    //p表示的是第几个结点,u表示的是哪个字母,如果s[p][u]不为空就证明有以这个字母为值的子结点
    //它代表的值就是指向了该子结点,即说明了第几个结点是它的子结点
    //如s[2][1]=3,表示结点2有一个值为b(第二个数字代表的是a~z)的子结点,是结点3
        if(!son[p][t]) 
        {
            idx++;
            son[p][t]=idx;
        }
        //令p指向子结点
        p=son[p][t];
    }
    //以这个结点为末尾的字符串次数加1
    cnt[p]++;//每个节点都对应一个唯一的idx,然后通过那个idx来统计次数
}
int query(string s)
{
    int p=0;
    for(int i=0;i<s.size();i++)
    {
        int t=s[i]-'a';
         //如果走不通了,即树中没有保存当前字符
        //则说明树中不存在该字符串
        if(!son[p][t]) return 0;
         //指向下一个节点
        p=son[p][t];
    }
     //循环结束的时候,p 等于字符串 s 的尾字符所对应的 idx
    // cnt[p] 就是字符串 s 出现的次数
    return cnt[p];
}
int main()
{
    cin>>n;
    while(n--)
    {
        char op;cin>>op;
        string s;cin>>s;
        if(op=='I') insert(s);
        else cout<<query(s)<<endl;
    }
    return 0;
}

 最大异或对

在给定的 N 个整数 A1,A2……AN 中选出两个进行 xor(异或)运算,得到的结果最大是多少?

输入格式

第一行输入一个整数 N。

第二行输入 N 个整数 A1~AN。

输出格式

输出一个整数表示答案。

数据范围

1≤N≤10^5
0≤Ai<2^31

输入样例:

3
1 2 3

输出样例:

3

 

查询函数做的是对A[i]在A[1]-A[i-1] 题解里是先插入A[i]所以实际上是A[1]到A[i],但A[i]肯定不会走 

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10,M=31*N;
int son[M][2];
int a[N];
int idx;
void insert(int x)
{
    int p=0;//初始化指向根节点
     //从最高位开始,依次取出每一位
    for(int i=31;i>=0;i--)
    {
        int u=(x>>i)&1;//取X的第i位的二进制数是什么
         //如果树中不能走到当前数字
        //为当前数字创建新的节点,保存该数字
        if(!son[p][u])
        {
            idx++;
            son[p][u]=idx;
        }
        p=son[p][u];//指针指向下一层
    }
}
int query(int x)
{
    int res=0; // 保存与 x 异或结果最大的那个数
    int p=0;//指向根节点
    for(int i=31;i>=0;i--) ///从最高位开始找
    {
        int u=(x>>i)&1;
          //如果树中能走到 !u,就走到!u
        if(son[p][!u])
        {
            p=son[p][!u];
            res=res*2+1;
        }
         //没有!u,就只能走到u了
        else
        {
            p=son[p][u];
            res=res*2+0;
        }
    }
    return res;
}
int main()
{
    int n;cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    int res=0;
    /*
      相当于
      for(int i=1;i<=n;i++)
      {
          for(int j=1;j<i;j++)
          {
              两层循环的感觉
          }
      }
      先插入后查找 后面查找的数会更新如果当前这个数最合适的数在后面
    */
    for(int i=1;i<=n;i++)
    {
        insert(a[i]);
       int num=query(a[i]);
       res=max(res,num);
    }
    cout<<res<<endl;
    return 0;
}

 异或和之差(蓝桥杯)

题目描述

给定一个含有 n 个元素的数组 Ai,你可以选择两个不相交的子段。求出这两个子段内的数的异或和的差值的最大值。

输入格式

输入的第一行包含一个整数 n 。

第二行包含 n 个整数 Ai ,相邻整数之间使用一个空格分隔。

输出格式

输出一行包含一个整数表示答案。

样例输入

6
1 2 4 9 2 7

样例输出

14

提示

两个子段可以分别选 1 和 4,9,2,差值为 15 − 1 = 14 。

对于 40% 的评测用例,n ≤ 5000 ;

对于所有评测用例,2 ≤ n ≤ 2 × 10^5,0 ≤ Ai ≤ 2^20 。

#include<iostream>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int N=2e5+10,M=N*21;
int son[M][2];//Tire树本身
int a[N],s[N];
//这四个数组的作用:因为题目中限制了 必须是两个不相交的字集 所以用来限制你所选的最大区间和最小区间没有交叉
int lmx[N],lmi[N];//[l,n]区间内异或的最大值或最小值
int rmx[N],rmi[N];//[1,r]区间内的最大值或最小值
int idx;
void insert(int x)
{
	int p=0;
	for(int i=20;i>=0;i--)
	{
		int u=(x>>i)&1;
		if(!son[p][u])
		{
			idx++;
			son[p][u]=idx;
		}
		p=son[p][u];
	}
}
int query_max(int x)
{
	int p=0;
	int res=0;
	for(int i=20;i>=0;i--)
	{
		int u=(x>>i)&1;
		if(son[p][!u])
		{
			res=res*2+1;
			p=son[p][!u];
		}
		else
		{
			res=res*2+0;
			p=son[p][u];
		}
	}
	return res;
}
int query_min(int x)
{
	int p=0;
	int res=0;
	for(int i=20;i>=0;i--)
	{
		int u=(x>>i)&1;
		if(son[p][u])
		{
			res=res*2+0;
			p=son[p][u];
		}
		else
		{
		    res=res*2+1;
			p=son[p][!u];
		}
	}
	return res;
}
signed main()
{
	int n;cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		s[i]=a[i]^s[i-1];
	}
    memset(rmx,0,sizeof rmx);
    memset(rmi,0x3f,sizeof rmi);
    insert(0);//前缀和 s0^s1=s1
     //不能先插入在查询 那样的话本来应该查询(1~i-1)这样就变成了(1-i)那么此时最大肯定不会走i的那条完整的路 但是最小可以
     //最小一直沿着i的那条路走 可以得到0
     //从左往右构造子树
	for(int i=1;i<=n;i++)
	{
		rmx[i]=max(rmx[i-1],query_max(s[i]));
		rmi[i]=min(rmi[i-1],query_min(s[i]));
		insert(s[i]);
	}
	//重新构造子树 从右往左构造
	memset(son,0,sizeof son);
	idx=0;
	memset(lmx,0,sizeof lmx);
	memset(lmi,0x3f,sizeof lmi);
	insert(0);
	for(int i=n;i>=1;i--)
	{
		lmx[i]=max(lmx[i+1],query_max(s[i]));
		lmi[i]=min(lmi[i+1],query_min(s[i]));
		insert(s[i]);
	}
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		ans=max(ans,rmx[i]-lmi[i+1]);
		ans=max(ans,lmx[i]-rmi[i-1]);
	}
	cout<<ans<<endl;
	return 0;
}

 

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

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

相关文章

突破外贸挑战:推荐几款优秀的CRM软件,解析解决方案

外贸企业面临的困境愈演愈烈&#xff0c;他们不仅面临着外部竞争对手以及市场的挑战&#xff0c;内部还面临着资金和管理难题的挤压。墨守成规&#xff0c;还按照之前单一的管理运营模式&#xff0c;迟早会被市场淘汰。 现在的市场趋势是企业要逐步走向精细化管理&#xff0c;将…

蓝牙学习十(扫描)

一、简介 从之前的文章中我们知道&#xff0c;蓝牙GAP层定义了四种角色&#xff0c;广播者&#xff08;Broadcaster&#xff09;、观察者&#xff08;Observer&#xff09;、外围设备&#xff08;Peripheral&#xff09;、中央设备&#xff08;Central&#xff09;。 之前的学习…

华为ICT七力助推文化产业新质生产力发展

创新起主导作用的新质生产力由新劳动者、新劳动对象、新劳动工具、新基础设施等四大要素共同构成&#xff0c;符合新发展理念的先进生产力质态&#xff1b;具有高科技、高能效、高质量等三大突出特征。而通过壮大新产业、打造新模式、激发新动能&#xff0c;新质生产力能够摆脱…

JMeter源码解读 - HashTree(超详细)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在 JMeter 中&#xff0c;HashTree 是一种用于组织和管理测试计…

网络安全意识也是基础防御中的关键一环

在当今数字化时代&#xff0c;网络安全已经成为企业和个人生活中不可或缺的一部分。网络攻击的不断演进和加剧使得保护个人隐私、商业机密和国家安全变得尤为重要。然而&#xff0c;网络安全并非仅仅是技术层面的问题&#xff0c;更是一个综合性的挑战&#xff0c;需要广泛的参…

场景文本检测识别学习 day01(传统OCR的流程、常见的损失函数)

传统OCR的流程 传统OCR&#xff1a;传统光学字符识别常见的的模型主要包括以下几个步骤来识别文本 预处理&#xff1a;预处理是指对输入的图像进行处理&#xff0c;以提高文字识别的准确率。这可能包括调整图像大小、转换为灰度图像、二值化&#xff08;将图像转换为黑白两色&…

Android视角看鸿蒙第十一课-鸿蒙的布局之层叠布局Stack

Android视角看鸿蒙第十一课-鸿蒙的布局之层叠布局 导读 在Android中我个人认为&#xff0c;最离不开的就是LinearLayout和FrameLayout了&#xff0c;RelativeLayout我都基本不用的。 所以我把层叠布局排在了第二位。 官方描述 如何定义层叠布局 Stack组件为容器组件&#x…

瑞登梅尔邀您参观2024第13届生物发酵展精彩不容错过

参展企业介绍 我们&#xff0c;瑞登梅尔(上海)纤维贸易有限公司 致力于研究、开发和生产以植物为原料的高品质有机纤维。我们让这些有价值的天然物质的许多特性&#xff0c;能够广泛应用于现代工业的各个领域。 JRS的纤维产品是由天然的、可再生的原料制成。例如&#xff1a;…

泛微OA 自定义多选浏览框

1、建模引擎-》应用建模-》表单 2、建模引擎-》应用建模-》模块 3、建模引擎-》应用建模-》查询 4、把查询页面挂到前端页面。 效果展示&#xff1a; 5、建模引擎-》应用建模-》浏览框 6、流程表单中字段应用

遥感影像处理利器:PyTorch框架下CNN-Transformer,地物分类、目标检测、语义分割和点云分类

目录 专题一 深度卷积网络知识详解 专题二 PyTorch应用与实践&#xff08;遥感图像场景分类&#xff09; 专题三 卷积神经网络实践与目标检测 专题四 卷积神经网络的遥感影像目标检测任务案例【FasterRCNN】 专题五 Transformer与遥感影像目标检测 专题六 Transformer的遥…

中药配方颗粒备案信息数据库<2.5W+备案>

中药配方颗粒备案信息是指中药配方颗粒生产企业向国家药品监督管理局申报备案的相关信息。备案信息包括中药配方颗粒的名称、备案号、备案时间、备案状态、生产企业、生产地址、规格、包装、执行标准、保质期、不良反应检测、备案省局等信息。 通过对中药配方颗粒备案信息的查…

完成产品兼容互认,用KubeBlocks可实现OceanBase集群管理

本文转载自云猿生聊技术&#xff08;CloudNativeDataTech&#xff09; 前言 KubeBlocks&#xff08;简称 KB&#xff09;在最新发布的0.7版本中&#xff0c;通过组件扩展&#xff08;Addon&#xff09;的形式新增了对OceanBase的支持功能。这一更新为企业级和非企业级用户提供…

数据结构6.2:二叉树的前中后序遍历

二叉树前中后序遍历代码实现 二叉树的遍历 二叉树的前序遍历 先输出父节点,再遍历左子树和右子树 二叉树的中序遍历 先遍历左子树,再输出父节点,再遍历右子树 二叉树的后序遍历 先遍历左子树,再遍历右子树,最后输出父节点 代码实现 每个节点中包含一个数据域和两个地址…

【VTKExamples::Meshes】第五期 ClipFrustum

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例ClipFrustum,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. ClipFrustum …

C语言函数实现冒泡排序

前言 今天我们来看看怎么使用函数的方式实现冒泡排序吧&#xff0c;我们以一个数组为例arr[] {9,8,7,6,5,4,3,2,1,0},我们将这个数组通过冒泡排序的方式让他变为升序吧。 代码实现 #include<stdio.h> void bubble_sort(int arr[], int sz) {int i 0;for (i 0;i < s…

简析数据安全保护策略中的十个核心要素

数据显示&#xff0c;全球企业组织每年在数据安全防护上投入的资金已经超过千亿美元&#xff0c;但数据安全威胁态势依然严峻&#xff0c;其原因在于企业将更多资源投入到数据安全能力建设时&#xff0c;却忽视了这些工作本身的科学性与合理性。因此&#xff0c;企业在实施数据…

1.2 接口测试之基本介绍

接口测试之基本介绍 1、接口测试啊 接口测试也叫api&#xff0c; 定义&#xff1a;测试系统和系统之间的数据交换&#xff0c;模块与模块之间的数据交互&#xff0c;程序与程序之间的数据交互&#xff1b; 如&#xff1a; http://cms.duoceshi.cn/manage/loginJump.do登录接…

CVPR 2024 | 拖拽P图又双叒升级了!DragNoise实现更快更准的拖拽编辑

前言 新加坡管理大学何盛烽团队联合华南师范大学在 CVPR 2024 上发表了工作《Drag Your Noise: Interactive Point-based Editing via Diffusion Semantic Propagation》。这一工作聚焦于利用扩散模型语义传播实现交互式点控制的图像编辑&#xff0c;只需点几个点&#xff0c;即…

JVM从1%到99%【精选】-初步认识

目录 &#x1f95e;1.什么是JVM &#x1f37f;2.JVM的功能 &#x1f953;3.常见的JVM &#x1f32d;4.JVM的位置 &#x1f9c2;5.JVM的整体结构 &#x1f383;6.JVM的生命周期 &#x1f388;7.JVM的架构模型 1.什么是JVM JVM本质上是一个运行在计算机上的程序,他的职责…

YOLOv7创新改进: 小目标 |新颖的多尺度前馈网络(MSFN) | 2024年4月最新成果

💡💡💡本文独家改进:多尺度前馈网络(MSFN),通过提取不同尺度的特征来增强特征提取能力,2024年最新的改进思路 💡💡💡创新点:多尺度前馈网络创新十足,抢先使用 💡💡💡如何跟YOLOv8结合:1)放在backbone后增强对全局和局部特征的提取能力;2)放在detect…