哈希表与离散化(题目)

A. 子串判重

题目描述:

给定一个含有 26 个小写英文字母的字符串。有 m 次询问,每次给出 2 个区间,请问这两个区间里的子字符串是否一样?

输入:

第一行输入一个字符串 S 。

第二行一个数字 m,表示 m 次询问。

接下来 m 行,每行四个数字 l1​,r1​,l2​,r2​ ,分别表示此次询问的两个区间,注意字符串的位置从 1 开始编号。

数据范围:

1≤length(S),m,l1​,r1​,l2​,r2​≤1000000。

输出:

对于每次询问,输出一行表示结果。

如果两个子串完全一样,输出 Yes,否则输出 No(注意大小写)。

样例:

输入:

aabbaabb

3

1 3 5 7

1 3 6 8

1 2 1 2

输出:

Yes

No

Yes

代码如下:​​​​​​

字符串哈希问题,注意本题数据量较大,因此不要循环字符串时求字符串长度,如果在循环中求,循环一次,求解一次,效率很低。

#include <bits/stdc++.h>
using namespace std;const int N = 1e6 +10,P = 131;
typedef unsigned long long ULL;
int m;
char s[N];
ULL h[N],p[N];//求子串的哈希
ULL fun(int l,int r){return h[r] - h[l-1] * p[r-l+1];
} int main(){scanf("%s%d",s+1,&m);//下标从1开始取p[0] = 1;//计算次数过多,不用每次循环都求一次长度int len = strlen(s+1); //预处理前缀和,以及p^n for(int i = 1;i <= len;i++){p[i] = p[i-1] * P;h[i] = h[i-1] * P + s[i]-'a'+1;} int l1,r1,l2,r2;while(m--){scanf("%d%d%d%d",&l1,&r1,&l2,&r2);if(fun(l1,r1)==fun(l2,r2)) printf("Yes\n");else printf("No\n");}return 0;
}


B. 前缀和后缀

题目描述:

给定若干由小写字母组成的字符串(这些字符串总长 ≤4×10^{5}),在每个字符串中求出所有既是前缀又是后缀的子串长度。

例如:ababcababababcabab,既是前缀又是后缀的:

ab,abab,ababcabab,ababcababababcabab 。

输入:

输入若干行,每行一个字符串。

输出:

对于每个字符串,输出一行,包含若干个递增的整数,表示所有既是前缀又是后缀的子串长度。

样例:

输入:

ababcababababcabab
aaaaa

输出:

2 4 9 18
1 2 3 4 5

代码如下

#include <bits/stdc++.h>
using namespace std;const int N = 4e5 + 10;
typedef unsigned long long ULL;
ULL h[N],p[N],P = 131;
char s[N];ULL get(int l,int r){return h[r] - h[l-1] * p[r-l+1];
}int main()
{while(scanf("%s",s+1)!=EOF){p[0] = 1;//预处理字符串前缀哈希值 和 p的次方for(int i = 1; s[i]; i++){p[i] = p[i-1] * P;h[i] = h[i-1] * P + (s[i]-'a'+1);}//计算所有可能的长度int len = strlen(s+1);for(int i = 1;i <= len;i++){if(get(1,i)==get(len-i+1,len)) printf("%d ",i);}printf("\n");}return 0;
}

C. 最多子串重复次数

题目描述:

给定若干个长度 ≤106 的字符串,询问每个字符串最多是由多少个相同的子字符串重复连接而成的。如:ababab 则最多有 3 个 ab 连接而成。

输入:

输入若干行(所有行的字符串的长度之和≤107),每行有一个字符串,字符串仅含英语小写字母。特别的,字符串可能为 . 即一个半角句号,此时输入结束。

输出:

对于每行输入,输出一个整数,代表计算的结果。

样例:

输入:

abcd
aaaa
ababab
.

输出:

1
4
3

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N=1e6+10,P=131;
ull h[N],p[N];
char s[N];
int m,len;
ull get(int l,int r){return h[r]-h[l-1]*p[r-l+1];
}
bool check(ull hh,int k){for(int i=k+1;i<=len;i+=k){if(get(i,i+k-1)!=hh) return 0;}return 1;
}
int main(){for(int i;;i++){scanf("%s",s+1);if(s[1]=='.') break;p[0]=1;len=strlen(s+1);for(int i=1;i<=len;i++){p[i]=p[i-1]*P;h[i]=h[i-1]*P+(s[i]-'a'+1);}for(int i=1;i<=len;i++){if(len%i==0){if(check(h[i],i)){printf("%d\n",len/i);break;}}}} return 0;
}

D. 书号管理

题目描述:

图书管理是一件十分繁杂的工作,在一个图书馆中每天都会有许多新书加入。为了更方便的管理图书(以便于帮助想要借书的客人快速查找他们是否有他们所需要的书),我们需要设计一个图书查找系统。

该系统需要支持 2 种操作:

add(x) 表示新加入一本书号为 x 的图书。

find(x) 表示查询是否存在一本书号为 x 的图书。

输入:

第一行包括一个正整数 n,表示操作数。 以下 n 行,每行给出 2 种操作中的某一个指令条,指令格式为:

add x
find x

在书号 x 与指令(add,find)之间有一个隔开,我们保证所有书号都是一个值在 [−109≤x≤109] 之间的整数。

本题 n≤106 。

输出:

对于每个 find(x) 指令,我们必须对应的输出一行 yes 或 no,表示当前所查询的书是否存在于图书馆内。

注意:一开始时图书馆内是没有一本图书的,本题允许加入到图书馆的书号 x 出现重复。

样例:

输入:

8
add 3
add 100006
add 6
find 6
add 100009
find 9
add -100000
find 3

输出:

yes
no
yes

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N=1e6+3;
ull h[N],e[N],ne[N],idx;
int n;
void insert(int x){int v=(x%N+N)%N;idx++;e[idx]=x;ne[idx]=h[v];h[v]=idx;
}
bool query(int x){int v=(x%N+N)%N;for(int i=h[v];i!=0;i=ne[i]){if(e[i]==x) return 1;}return 0;
}
int main(){scanf("%d",&n);char order[10];int x;while(n--){scanf("%s%d",order,&x);if(order[0]=='a') insert(x);else{if(query(x)) printf("yes\n");else printf("no\n");}}return 0;
}

E. 图书管理

题目描述:

图书管理是一件十分繁杂的工作,在一个图书馆中每天都会有许多新书加入。为了更方便的管理图书(以便于帮助想要借书的客人快速查找他们是否有他们所需要的书),我们需要设计一个图书查找系统。

该系统需要支持 2 种操作:

add(s) 表示新加入一本书名为 s 的图书。

find(s) 表示查询是否存在一本书名为 s 的图书。

输入:

第一行包括一个正整数 n,表示操作数。

以下 n 行,每行给出 22 种操作中的某一个指令条,指令格式为:

add s
find s

在书名 s 与指令(add,find)之间有一个空格隔开,我们保证所有书名的长度都不超过 200 。

可以假设读入数据是准确无误的。

本题 n≤30000 。

输出:

对于每个 ����(�)find(s) 指令,我们必须对应的输出一行 yes 或 no,表示当前所查询的书是否存在于图书馆内。

注意:一开始时图书馆内是没有一本图书的。并且,对于相同字母不同大小写的书名,我们认为它们是不同的。

样例:

输入:

4
add Inside C#
find Effective Java
add Effective Java
find Effective Java

输出:

no
yes

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10,M=1e4+10;
int a[N],b[N],c[M];
int n;
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);b[i]=a[i];}sort(b+1,b+n+1);int k=unique(b+1,b+n+1)-b-1;int x;for(int i=1;i<=n;i++){x=lower_bound(b+1,b+k+1,a[i])-b;c[x]++;}for(int i=1;i<=k;i++){printf("%d %d\n",b[i],c[i]);}return 0;
}

G. 自动灌溉

题目描述:

农场的有一个用于科学研究的大棚,大棚内有一条笔直的直线,直线的每个整数位置上都种植了一株科研植物,整数位置的范围为 [0,109]。

大棚内设有一个自动灌溉机,会根据各植物检测到的特征数据,对特定位置的植物进行灌溉 。

现从计算机中调取了某一天 N 次灌溉记录。第 i 条灌溉记录有两个数据 Pi​ 和 Xi​,代表为位于 Pi​ 位置的植物,灌溉了 Xi​ 毫升的水。

针对当天的灌溉记录有 M 次询问,第 j 条询问需要计算一个区间 [Lj​,Rj​] 当天的总灌溉量。

请编程计算出 M 次询问,每次的询问结果。

输入:

第 1 行读入 2 个整数 N 和 M;

接下来 N 行,每行读入 2 个整数 P 和 X;

接下来 M 行,每行读入 2 个整数 L 和 R;

输出:

输出 M 行,每行一个整数,代表每次询问的结果。

样例:

输入:

3 4
2 1
8 2
5 3
1 3
2 5
3 8
2 8

输出:

1
4
5
6

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int p[N],x[N],l[N],r[N];
int a[N*3],c[N*3],k=0;
int n,m;
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d%d",&p[i],&x[i]);a[++k]=p[i];}for(int i=1;i<=m;i++){scanf("%d%d",&l[i],&r[i]);a[++k]=l[i];a[++k]=r[i];}sort(a+1,a+k+1);k=unique(a+1,a+k+1)-a-1;for(int i=1;i<=n;i++){p[i]=lower_bound(a+1,a+k+1,p[i])-a;c[p[i]]+=x[i];}for(int i=1;i<=k;i++){c[i]+=c[i-1];}for(int i=1;i<=m;i++){l[i]=lower_bound(a+1,a+k+1,l[i])-a;r[i]=lower_bound(a+1,a+k+1,r[i])-a;printf("%d\n",c[r[i]]-c[l[i]-1]);}return 0;
}

H. 程序自动分析

题目描述:

在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。

考虑一个约束满足问题的简化版本:假设 x1​,x2​,x3​,⋯ 代表程序中出现的变量,给定 n 个形如 xi​=xj​ 或 xi​≠xj​ 的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同时被满足。例如,一个问题中的约束条件为:x1​=x2​,x2​=x3​,x3​=x4​,x4≠x1​,这些约束条件显然是不可能同时被满足的,因此这个问题应判定为不可被满足。

现在给出一些约束满足问题,请分别对它们进行判定。

输入:

输入的第一行包含一个正整数 t,表示需要判定的问题个数。注意这些问题之间是相互独立的。

对于每个问题,包含若干行:

第一行包含一个正整数 n,表示该问题中需要被满足的约束条件个数。接下来 n 行,每行包括三个整数 i,j,e,描述一个相等/不等的约束条件,相邻整数之间用单个空格隔开。若 e=1,则该约束条件为 xi​=xj​。若e=0,则该约束条件为 xi​≠xj​。

输出:

输出包括 t 行。

输出文件的第 k 行输出一个字符串 YES 或者 NO(字母全部大写),YES 表示输入中的第 k 个问题判定为可以被满足,NO 表示不可被满足。

样例:

输入:

2
2
1 2 1
1 2 0
2
1 2 1
2 1 1

输出:

NO
YES

输入:

2
3
1 2 1
2 3 1
3 1 1
4
1 2 1
2 3 1
3 4 1
1 4 0

输出:

YES
NO

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
struct node{int x,y,e;
}a[N];
int b[N*2],fa[N*2],k;
int n,t;
bool f;
bool cmp(node n1,node n2){return n1.e>n2.e;
}
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);
}
void merge(int x,int y){int rx=find(x);int ry=find(y);if(rx!=ry){fa[rx]=ry;}
}
int main(){scanf("%d",&t);while(t--){scanf("%d",&n);for(int i=1;i<=n*2;i++){fa[i]=i;}k=0;for(int i=1;i<=n;i++){scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].e);b[++k]=a[i].x;b[++k]=a[i].y;}sort(b+1,b+k+1);k=unique(b+1,b+k+1)-b-1;sort(a+1,a+n+1,cmp);f=1;for(int i=1;i<=n;i++){a[i].x=lower_bound(b+1,b+k+1,a[i].x)-b;a[i].y=lower_bound(b+1,b+k+1,a[i].y)-b;if(a[i].e==1){merge(a[i].x,a[i].y);}else{if(find(a[i].x)==find(a[i].y)){f=0;break;}}}if(f) puts("YES");else puts("NO");}return 0;
}

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

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

相关文章

000-基于Sklearn的机器学习入门:工作环境搭建与配置

本专栏将介绍基于Scikit-learn(简称Sklearn)的机器学习入门知识。包括但不一定限于&#xff0c;机器学习基本知识、Sklearn库简介&#xff0c;基于Sklearn库的机器学习实践。 这是本专栏的第000篇&#xff0c;将介绍如何安装和配置Sklearn环境&#xff0c;不仅包括Sklearn库的…

超级详细!如何正确使用JMeter性能测试?紧扣面试实际要求

前段时间专门挑了一段时间在准备面试。经过两次面试后&#xff0c;有一些比较深刻的认识。对于企业要求来说&#xff0c;除了对专业理论知识考究之外&#xff0c;对测试工具这块也是看重的。 一、使用JMeter测试快速入门 1、线程组是什么 进程&#xff1a; 一个正在执行的程序…

【springboot整合mybatis】xml文件映射不到

# spring框架中整合Mybatis时&#xff0c;指定该属性一边spring容器能够加载和解析mybatis的Mapper XML文件 mybatis.mapper-locationsclasspath:mapper/*.xml这条配置是MyBatis框架中用来指定Mapper XML文件位置的配置项。在Spring框架中整合MyBatis时&#xff0c;通常会在配置…

Arduino ESP8266模块TFT液晶屏

ESP8266模块 模块实物图&#xff1a; 模块引脚定义&#xff1a; 工作模式选择&#xff1a; FlashBoot启动模式&#xff1a; GPIO15接GND UART固件下载模式: GPIO15接GND&#xff0c; GPIO0接GND 调试串口&#xff1a; URXD/UTXD 可用来下载固件和调试信息输出 模块使能&…

WebService的配置

如果提示”对操作“XXX”的回复消息正文进行反序列化时出错 那么多半是因为字符长度不够 调整参数 maxStringContentLength"10485760" maxReceivedMessageSize"2147483647" maxBufferSize"2147483647" 示例&#xff1a; messageVersion&qu…

VMware虚拟机与MobaXterm建立远程连接失败

VMware虚拟机与MobaXterm建立远程连接失败 首先可以检查一下是不是虚拟机的ssh服务并不存在 解决方法&#xff1a; 1.更新镜像源 yum -y update 这个过程会有点久&#xff0c;请耐心等待 2.安装ssh yum install openssh-server 3.启动ssh systemctl restart sshd 4.查…

K8s存储对象的使用

背景和概念 容器中的文件在磁盘上是临时存放的&#xff0c;这给在容器中运行较重要的应用带来一些问题&#xff1a; 当容器崩溃或停止时&#xff0c;此时容器状态未保存&#xff0c; 因此在容器生命周期内创建或修改的所有文件都将丢失。另外 在崩溃期间&#xff0c;kubelet 会…

git命令行分支(增删改查)

文章目录 一、创建分支并推送到远程仓库二、拉取指定分支代码三、删除分支 一、创建分支并推送到远程仓库 初始化git git init如果有远程仓库就进行克隆远程仓库 origin 表示远程仓库地址 git clone origin# 如果没有远程仓库 就进行创建一个远程仓库 git remote add origin ht…

MySQL经典练习50题(下)(解析版)

所有笔记、生活分享首发于个人博客 想要获得最佳的阅读体验&#xff08;无广告且清爽&#xff09;&#xff0c;请访问本篇笔记 书接上回&#xff08;1-25&#xff09; 经典50题&#xff08;26-50&#xff09; 查询每门课被选修的学生数 SELECT c.c_name,COUNT(DISTINCT sc.s_…

Flink的简单学习(kafka)三

一 Kafka的介绍 1.kafka是一个高吞吐的分布式消息系统&#xff0c;是一个消息队列。 2.生产者负责生产数据 &#xff0c;消费者负责消费数据 3.特点&#xff1a; 生存者消费者模型&#xff0c;FIFO 高性能&#xff1a;单节点支持上千个客户端&#xff0c;百MB/s吞吐 持久…

【Spring Cloud Alibaba】开源组件Sentinel

目录 什么是Sentinel发展历史与Hystrix的异同 Sentinel可以做什么&#xff1f;Sentinel的功能Sentinel的开源生态Sentinel的用户安装Sentinel控制台预备环境准备Sentinel 分为两个部分:下载地址 项目集成Sentinel创建项目修改依赖信息添加启动注解添加配置信息在控制器类中新增…

一条sql的执行流程

文章地址 https://blog.csdn.net/qq_43618881/article/details/118657040 连接器 请求先走到连接器&#xff0c;与客户端建立连接、获取权限、维持和管理连接 mysql缓存池 如果要查找的数据直接在mysql缓存池里面就直接返回数据 分析器 请求已经建立了连接&#xff0c;现在…

常见的XXE ---playload

XXE&#xff08;XML External Entity&#xff09;攻击是一种常见的Web安全漏洞&#xff0c;它允许攻击者干扰应用程序处理XML数据的方式。XXE攻击通常发生在应用程序解析XML输入时&#xff0c;没有正确地处理外部实体。 以下是一些常见的XXE攻击playload&#xff1a; 基本的XX…

基于Python的农业统计数据可视化系统设计与实现

基于Python的农业统计数据可视化系统设计与实现 Design and Implementation of Agricultural Statistical Data Visualization System Based on Python 完整下载链接:基于Python的农业统计数据可视化系统设计与实现 文章目录 基于Python的农业统计数据可视化系统设计与实现摘…

MySql索引的数据结构

mysql索引是什么&#xff1f; 想象一下&#xff0c;你手上有一本数学教材&#xff0c;但是目录被别人给撕掉了&#xff0c;现在要你翻到三三角函数的那一页&#xff0c;该怎么办&#xff1f; 没有了目录&#xff0c;就只有两种方法&#xff0c;要么一页一页翻&#xff0c;要么…

【开源】APIJSON 框架

简述 APIJSON是一个关于API和JSON的综合技术或框架&#xff0c;一种专为API设计的JSON网络传输协议&#xff0c;以及基于这套协议实现的ORM库。 1. 定义与特点&#xff1a; APIJSON是一种基于接口的JSON传输结构协议&#xff0c;它允许客户端定义任何JSON结构来向服务端发起…

前端基础总结

1.将一个数组转换为另一个新的数组 在前端页面中&#xff0c;将数组A赋值给数组B&#xff0c;再将数组A赋值给数组C&#xff0c;改变数组C的值&#xff0c;数组A和数组B的值同时发生改变&#xff0c;因为3个数组都是指向同一内存地址&#xff0c;要避免这种情况&#xff0c;可…

SpringBoot项目使用CXF框架开发SOAP通信接口

文章目录 引言I SOAP1.1 SOAP消息组成1.2 XFire WebService 框架1.3 CXF框架II 测试访问webService效果2.1 浏览器访问暴露出的soap接口2.2 SOAP接口调试工具:SoapUI2.3 使用hutool的SoapClient调用soap接口2.4 使用cxf自带的工具请求webservice接口2.5 使用Postman测试工具来…

反激电源的类型与特点

主要分为 1 固定频率&#xff08;CCMDCM&#xff09; 2 可变频率控制&#xff08;CRM电流临界模式&#xff09; 这三种模式是很好辨别的&#xff0c;首先我们看左边的连续模式&#xff0c;Vds能看到他有一些尖峰毛刺&#xff0c;这是场效应管关闭的时候&#xff0c;LRC谐振导…

合势而上 聚力成峰 |“我店平台616购物嘉年华发布会”圆满落幕

引言 合势而上&#xff0c;聚力成峰&#xff1b;我店力量&#xff0c;势如破竹。 6月2日&#xff0c;“合势而上聚力成峰——我店平台616购物嘉年华发布会”于杭州顺利举办。会上&#xff0c;我店平台董事长肖翰成携手公司一众高管&#xff0c;正式启动“我店平台616购物嘉年华…