数据结构模板2

Trie树:用来高效存储和查找字符串集合的数据结构:

模板题:https://www.acwing.com/problem/content/837/

AC代码:

#include<bits/stdc++.h>
using namespace std;
int son[100010][26],cnt[100010],idx;
char str[100010];
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];}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 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));}
}

再来个十分典的:https://www.acwing.com/problem/content/145/

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int son[3200000][2],idx,a[100010];
int n;
void insert(int k)
{int p=0;int res=0;for(int i=30;i>=0;i--){int u=k>>i&1;if(!son[p][u]) son[p][u]=++idx;p=son[p][u];}
}
int query(int k)
{int p=0,res=0;for(int i=30;i>=0;i--){int u=k>>i&1;if(!son[p][1-u]){p=son[p][u];res=2*res+u;}else{p=son[p][1-u];res=2*res+1-u;}}return res;
}
int main()
{cin>>n;for(int i=1;i<=n;i++) cin>>a[i];int res=0;for(int i=1;i<=n;i++){insert(a[i]);int ck=query(a[i]);res=max(res,a[i]^ck);}cout<<res;
}

堆:

主要实现这5个功能:

1.插入一个数 2.求集合最小值 3.删除最小值 4.删除任意一个元素 5.修改任意一个元素

是一个完全二叉树,对于小根堆每一个父节点小于它的儿子,根节点就是min

模板题:https://www.acwing.com/problem/content/840/

AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int h[100010],size1;
void down(int u)
{int t=u;if(u*2<=size1&&h[u*2]<h[t]) t=u*2;if(u*2+1<=size1&&h[u*2+1]<h[t]) t=u*2+1;if(u!=t){swap(h[u],h[t]);down(t);}
}
int main()
{cin>>n>>m;for(int i=1;i<=n;i++) cin>>h[i];size1=n;for(int i=size1/2;i;i--) down(i);while (m -- ){cout<<h[1]<<" ";h[1]=h[size1];size1--;down(1);}
}

模板题:https://www.acwing.com/problem/content/841/

其中用到了映射关系,具体可以看某大佬题解:https://www.acwing.com/solution/content/5661/

AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=1e5+10;
int h[N];   //堆
int ph[N];  //存放第k个插入点的下标
int hp[N];  //存放堆中点的插入次序
int cur_size;   //size 记录的是堆当前的数据多少
void heap_swap(int u,int v)
{swap(h[u],h[v]);swap(ph[hp[u]],ph[hp[v]]);swap(hp[u],hp[v]);
}void down(int u)
{int t=u;if(u*2<=cur_size&&h[t]>h[u*2]) t=u*2;if(u*2+1<=cur_size&&h[t]>h[u*2+1])  t=u*2+1;if(u!=t){heap_swap(u,t);down(t);}
}
void up(int u)
{if(u/2>0&&h[u]<h[u/2]) {heap_swap(u,u/2);up(u>>1);}
}
int main()
{int n,m=0;cin>>n;while (n -- ){string op;int k,x;cin>>op;if(op=="I"){cin>>x;m++;h[++cur_size]=x;ph[m]=cur_size;hp[cur_size]=m;up(cur_size);down(cur_size);}else if(op=="PM")    cout<<h[1]<<endl;else if(op=="DM"){heap_swap(1,cur_size);cur_size--;down(1);}else if(op=="D"){cin>>k;int u=ph[k];//注意不能直接ph[k]heap_swap(ph[k],cur_size);cur_size--;down(u);up(u);}else if(op=="C"){cin>>k>>x;h[ph[k]]=x;                 down(ph[k]);                up(ph[k]);}}
}

哈希表:按照存储结构可以分为开放寻址法以及拉链法

模板题:https://www.acwing.com/problem/content/842/

拉链法的AC代码:

#include<bits/stdc++.h>
using namespace std;
const int N=100003,null=0x3f3f3f3f;//最好是质数
int h[N],e[N],ne[N],idx;//链表,h相当于槽,类似链式前向星
void insert(int x){int k=(x%N+N)%N;e[idx]=x,ne[idx]=h[k],h[k]=idx++;}
bool find(int x){int k=(x%N+N)%N;for(int i=h[k];i!=-1;i=ne[i]){if(e[i]==x) return 1;}return 0;
}
int main(){int n;cin>>n;memset(h,-1,sizeof(h));while(n--){char op[2];int x;scanf("%s%d",op,&x);if(*op=='I') insert(x);else{if(find(x)) puts("Yes");else puts("No");}}
}

开放寻址法:

#include<bits/stdc++.h>
using namespace std;
const int M=200003,null=0x3f3f3f3f;
int h[M];
int find(int x){int k=(x%M+M)%M;while(h[k]!=null&&h[k]!=x){k++;if(k==M) k=0;}return k;
}
int main(){int n;cin>>n;memset(h,0x3f,sizeof(h));while(n--){char op[2];int x;scanf("%s%d",op,&x);if(*op=='I'){int k=find(x);h[k]=x;}else{int k=find(x);if(h[k]!=null) puts("Yes");else puts("No");}}
}

还可以通过字符串前缀哈希法:https://www.acwing.com/activity/content/problem/content/891/

具体就是先确定一个把字符串映射成一个数的函数,我们可以把它看出p进制再mod Q,A,B,等赋予不同的权值(最好不要0,否则AA,A就是同一个了),这里有个经验值,我们一般取p=131或者13331,Q=2^64,我们可以认为此时没有冲突值。

这样+前缀哈希就可以计算出所有子串的哈希值:h[r]-h[l]*p^(r-l+1).

这里有个技巧:我们开unsigned long long 这样modQ就可以用溢出直接代替了 

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N = 100010, P = 131;int n, m;
char str[N];
ull h[N], p[N];
ull get(int l, int r)
{return h[r] - h[l - 1] * p[r - l + 1];
}
int main()
{scanf("%d%d", &n, &m);scanf("%s", str + 1);p[0]=1;for(int i=1;i<=n;i++){h[i] = h[i - 1] * P + str[i];p[i] = p[i - 1] * P;}while (m -- ){int l1, r1, l2, r2;scanf("%d%d%d%d", &l1, &r1, &l2, &r2);if (get(l1, r1) == get(l2, r2)) puts("Yes");else puts("No");}
}

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

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

相关文章

微信文件太大传不了?学会这些,微信秒变大文件传输神器

在数字化时代&#xff0c;微信已成为我们日常沟通的重要桥梁。然而&#xff0c;当需要在微信上传输大文件时&#xff0c;文件大小的限制往往让人束手无策。 今天&#xff0c;我们将分享一些实用的技巧&#xff0c;帮助你在微信上轻松传输大文件&#xff0c;无论是工作文档还是…

02 源码编译构建LAMP

目录 2.1Apache 网站服务基础 2.1.1Apache 简介 1. Apache 的起源 2. Apache的主要特点 2.1.2安装httpd服务器 1. 准备工作 2.源码编译及安装 (1)解包 (2)配置 (3)编译及安装 3.确认安装结果 4.优化执行路径 5. 添加 httpd 系统服务 2.2 httpd服务器的基本配置 …

网站地址显示不安全怎么办

当网址栏显示不安全时&#xff0c;通常是因为网站使用的是HTTP而不是HTTPS协议&#xff0c;或者因为网站的SSL证书存在问题。以下是一些解决方法&#xff1a;1、迁移到HTTPS&#xff1a;如果您是网站所有者&#xff0c;最好的解决方法是将网站迁移到HTTPS。HTTPS通过使用SSL/TL…

docker 开启端口 2375 供外部程序访问 (不推荐,容易被黑客利用)

重点 : 写在最前面,该方法有漏洞,容易被黑客远程放入挖矿机镜像,开启需做好防范 推荐使用 CA加密端口 或者 使用 SSH 转发端口 docker服务文件位置 /usr/lib/systemd/system/docker.service 编辑 docker.service 找到Service标签下的ExecStart属性 ExecStart/usr/bin/dock…

【Hec-HMS】第一期:模型简介及软件安装

HEC-HMS模型简介及软件安装 HEC-HMS模型简介建模思路 HEC-HMS软件安装步骤1&#xff1a;安装InstallShield Wizard步骤2&#xff1a;安装HEC-HMS 参考 HEC-HMS模型简介 HEC-HMS(The Hydrologic Engineering Center’s-Hydrologic Modelimng System)&#xff0c;美国陆军工程兵…

arm环境安装达梦数据库

作者&#xff1a;振鹭 一、安装前准备 1、创建用户和用户组 groupadd dinstall useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba2、修改文件打开最大数 vi /etc/security/limits.conf #文件末尾添加以下四行 dmdba hard nofile 65536 dmdba soft nofile 65536 d…

简易限流实现

需求描述 写一个1秒两个的限流工具类&#xff0c;2r/s 使用semaphore 代码实现-类似令牌桶算法 public class LimitHelper {private int maxLimit;private Semaphore semaphore;private int timeoutSeconds;public LimitHelper(int maxLimit, int timeoutSeconds) {this.max…

UE4 解决创建布料报错:三角形退化

**【问题】**创建创建布料时报错&#xff1a;三角形退化 【方法】 1.要重新绑定&#xff1a;导入到ue4为静态网格体&#xff0c;勾选“移除退化”&#xff0c;再导出fbx&#xff0c;再重新绑定 2.不用重新绑定&#xff1a;使用排除法&#xff08;费时&#xff09;&#xff0c…

Web 自动化测试主流框架都有哪些?

Web移动端自动化测试成为了现代软件开发流程中的重要环节&#xff0c;因此&#xff0c;很多主流框架被开发出来来帮助开发人员提高测试效率。本篇文章将从零到一详细介绍Web移动端自动化测试的主流框架。 一、Web移动端自动化测试框架简介 Web移动端自动化测试框架是一种开发工…

基因检测3 - 遗传性耳聋

1. 耳聋简介 在每1000个新生儿中有1-3个耳聋患儿&#xff0c;绝大部分为遗传学耳聋。遗传性耳聋疾病的遗传方式包括常染色体隐性遗传、常染色体显性遗传、线粒体遗传以及伴性遗传。 根据遗传性耳聋除听力损失外是否存在其他表型&#xff0c;将耳聋分为综合征型耳聋 &#xff…

网络安全合规建设

网络安全合规建设 一、法律安全需求基本合规&#xff08;1&#xff09;《网络安全法》重要节点等级保护政策核心变化 二、安全需求 业务刚需&#xff08;1&#xff09;内忧&#xff08;2&#xff09;外患 三、解决方法&#xff08;1&#xff09;总安全战略目标图&#xff08;2&…

卷积神经网络——LeNet——FashionMNIST

目录 一、整体结构二、model.py三、model_train.py四、model_test.py GitHub地址 一、整体结构 二、model.py import torch from torch import nn from torchsummary import summaryclass LeNet(nn.Module):def __init__(self):super(LeNet,self).__init__()self.c1 nn.Conv…

第3章 计算机视觉基础

第3章 计算机视觉基础 3.1 计算机视觉 3.1.1 计算机视觉概述 计算机视觉&#xff08;Computer Vision&#xff09;又称机器视觉&#xff08;Machine Vision&#xff09;&#xff0c;是一门让机器学会如何去“看”的学科&#xff0c;是深度学习技术的一个重要应用领域&#xff0…

会员运营体系设计及SOP梳理

一些做会员的经验和方法分享给大家&#xff0c;包括顶层思考、流程的梳理、组织的建立&#xff0c;后续会做成系列&#xff0c;最近几期主要围绕顶层策略方面&#xff0c;以下是核心内容的整理&#xff1a; 1、会员运营体系设计 顶层设计与关键业务定位&#xff1a;建立客户运营…

使用ResizeObserver观察DOM元素的尺寸变化

文章目录 关于ResizeObserver示例代码示例代码结果如下所示echarts自适应容器div大小示例代码结果如下所示echarts自适应容器大小的方式二 关于ResizeObserver 关于这个Web API&#xff0c;可以看mdn的官网&#xff0c;ResizeObserver - Web API | MDN (mozilla.org)&#xff…

CvT:微软提出结合CNN的ViT架构 | 2021 arxiv

CvT将Transformer与CNN在图像识别任务中的优势相结合&#xff0c;从CNN中借鉴了多阶段的层级结构设计&#xff0c;同时引入了Convolutional Token Embedding和Convolutional Projection操作增强局部建模能力&#xff0c;在保持计算效率的同时实现了卓越的性能。此外&#xff0c…

【R语言+Gephi】利用R语言和Gephi实现共发生网络的可视化

【R语言Gephi】利用R语言和Gephi实现共发生网络的可视化 注&#xff1a;本文仅作为自己的学习记录以备以后复习查阅 一 概述 Gephi是一款开源免费的多平台网络分析软件&#xff0c;在Windows、Linux和Mac os上均可以运行&#xff0c;像他们官网所说的&#xff0c;他们致力于…

前端/python脚本/转换-使用天地图下载的geojson(echarts4+如果直接使用会导致坐标和其他信息不全)

解决echarts4如果直接使用天地图下载的geojson会导致坐标和其他信息不全 解决方法是使用python脚本来补全其他信息&#xff1a;center&#xff0c;level&#xff0c;adcode等内容 前提是必须有一个之前使用的json文件&#xff08;需要全一点的数据供echarts使用&#xff09; …

python(3.7版本)安装mitmproxy

环境介绍:win11, python3.7 pip install mitmproxy5.0.0 命令行cmd下,输入 Mitmdump 查看结果是否报错 如果报错上面这样子,就是markupsafe版本问题 换个Markupsafe版本就可以了 成功了吧!!!,如有问题,欢迎留言

js 图片放大镜

写购物项目的时候&#xff0c;需要放大图片&#xff0c;这里用js写了一个方法&#xff0c;鼠标悬浮的时候放大当前图片 这个是class写法 <!--* Descripttion: * Author: 苍狼一啸八荒惊* LastEditTime: 2024-07-10 09:41:34* LastEditors: 夜空苍狼啸 --><!DOCTYPE …