集合询问

news/2024/4/24 19:03:52/文章来源:https://www.cnblogs.com/onlyblues/p/16609395.html

集合询问

有一个整数集合,初始时集合为空。

现在,要对该集合进行 t 次操作,操作分为以下三种:

  • + x ,将一个非负整数 $x$ 添加至集合中。注意,集合中可以存在多个相同的整数。
  • - x,从集合中删除一个非负整数 $x$。可以保证执行此操作时,集合中至少存在一个 $x$。
  • ? s,询问操作,给定一个由 $0$ 和 $1$ 组成的模板 $s$,请你计算并输出此时集合中有多少个元素可以与 $s$ 相匹配。

关于判断整数 $x$ 与模板 $s$ 是否匹配的具体方法如下:

  • 首先,在进行匹配判断前,应保证 $x$ 与 $s$ 位数相同,如果两者位数不同,则位数更少的一方需补充前导 $0$ 至与位数更多的一方位数相同为止。
  • 从最高位开始,对每一位进行逐个判断,如果 $s$ 的第 $i$ 位为 $0$,则 $x$ 的第 $i$ 位必须为偶数,如果 $s$ 的第 $i$ 位为 $1$,则 $x$ 的第 $i$ 位必须为奇数。
  • 如果有任意一位不满足上述条件,则视为 $x$ 与 $s$ 不匹配。如果所有位均满足上述条件,则视为 $x$ 与 $s$ 匹配。

例如,如果 $s=010$,则 $92$、$2212$、$50$、$414$ 与 $s$ 匹配,而 $3$、$110$、$25$、$1030$ 与 $s$ 不匹配。

输入格式

第一行包含整数 $t$,表示操作次数。

接下来 $t$ 行,每行包含一个操作,格式如题面描述。

保证至少存在一个查询操作。

输出格式

每个查询操作输出一行结果,一个整数,表示集合中与 $s$ 匹配的元素个数。

数据范围

前 $4$ 个测试点满足 $1 \leq t \leq 20$。
所有测试点满足 $1 \leq t \leq {10}^{5}$,$0 \leq x < {10}^{18}$,$s$ 的长度范围 $[1,18]$。

输入样例1:

 1 12
 2 + 1
 3 + 241
 4 ? 1
 5 + 361
 6 - 241
 7 ? 0101
 8 + 101
 9 ? 101
10 - 101
11 ? 101
12 + 4000
13 ? 0

输出样例1:

2
1
2
1
1

输入样例2:

1 5
2 + 200
3 + 200
4 ? 0
5 - 200
6 ? 0

输出样例2:

1 2
2 1

 

解题思路

  对于任意一个数,我们不关心它每一位上的具体数值,而只用关心每一位数值的奇偶性,因为最多只用$18$位数,每一位上不是$0$就是$1$,因此一共有$2^{18}$种不同的状态。

  因此可以开一个$2^{18}$大小的数组作为哈希表,对于每个数字,先把它根据每一位的奇偶性转换成对应的二进制数。对于添加操作,直接在对应的哈希表中加$1$,删除操作就在对应的哈希表中减$1$,查询操作就返回对应的哈希表中的值。

  AC代码如下:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int N = 1 << 18;
 5 
 6 int mp[N];
 7 
 8 int main() {
 9     int n;
10     scanf("%d", &n);
11     while (n--) {
12         char op[5], str[20];
13         scanf("%s %s", op, str);
14         int x = 0;
15         for (int i = 0; str[i]; i++) {
16             x = x << 1 | str[i] & 1;    // '0'的ascii为48
17         }
18         
19         if (op[0] == '+') mp[x]++;
20         else if (op[0] == '-') mp[x]--;
21         else printf("%d\n", mp[x]);
22     }
23     
24     return 0;
25 }

  还可以用Trie,就是比较麻烦。比赛的时候就想到Trie,因为想到是维护一堆$01$串,以及匹配查询,然后莫名想到状态机然后就想到用Trie了。

  AC代码如下:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int N = 1.8e6 + 10;
 5 
 6 int son[N][2], cnt[N], idx;
 7 
 8 void insert(string str, bool flag) {    // flag=true表示插入,flag=false表示删除
 9     while (str.size() < 18) {
10         str = '0' + str;
11     }
12     int p = 0;
13     for (int i = 0; i < str.size(); i++) {
14         if (!son[p][str[i] & 1]) son[p][str[i] & 1] = ++idx;
15         p = son[p][str[i] & 1];
16     }
17     if (flag) cnt[p]++;
18     else cnt[p]--;
19 }
20 
21 int query(string str) {
22     while (str.size() < 18) {
23         str = '0' + str;
24     }
25     int p = 0;
26     for (int i = 0; i < str.size(); i++) {
27         if (!son[p][str[i] & 1]) return 0;
28         p = son[p][str[i] & 1];
29     }
30     
31     return cnt[p];
32 }
33 
34 int main() {
35     int n;
36     scanf("%d", &n);
37     while (n--) {
38         char op[5], str[20];
39         scanf("%s %s", op, str);
40         if (op[0] == '+') insert(str, true);
41         else if (op[0] == '-') insert(str, false);
42         else printf("%d\n", query(str));
43     }
44     
45     return 0;
46 }

 

参考资料

  AcWing 4604. 集合询问(AcWing杯 - 周赛):https://www.acwing.com/video/4244/

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

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

相关文章

Flex 布局 display:flex 与 inline-flex 区别

1.Flex布局 display:flex.bigbox{ width: 500px; height: 400px; background:#ff0000; display: flex; } .smallbox{ width: 100px; height: 100px; background: #f5f5f5; margin: 10px; }<span>flex</span> <div class="bigb…

Java核心知识体系4:AOP原理和切面应用

1 概述 我们所说的Aop(即面向切面编程),即面向接口,也面向方法,在基于IOC的基础上实现。 Aop最大的特点是对指定的方法进行拦截并增强,这种增强的方式不需要业务代码进行调整,无需侵入到业务代码中,使业务与非业务处理逻辑分离。 以Spring举例,通过事务的注解配置,Sp…

npm warn config global `--global`, `--local` are deprecated. use `--location=global` instead.

报错信息: npm warn config global `--global`, `--local` are deprecated. use `--location=global` instead. 报错截图: 如何弃用 npm WARN 配置全局 –global, –local。使用“–location=global”代替“错误发生? 当我尝试使用-g的全局命令时,只是尝试安装使用npm ins…

【面试题】循环打印红绿灯

循环打印红绿灯 点击打开视频讲解更加详细 红灯3秒后变成绿灯 绿灯5秒后变成黄灯 黄灯2秒后变成红灯案例: <template><div id="app"><div>循环打印红绿灯</div><div>红灯3秒后变成绿灯</div><div>绿灯5秒后变成黄灯</…

Python custom modify the __add__ method All In One

Python custom modify the __add__ method All In OnePython 改写 `__add__` 类方法Python custom modify the add method All In OnePython 改写 __add__ 类方法"""# class Juice: # def __init__(self, name, capacity): # self.name = name # …

高亮显示指定内容

问题:海量数据中,高亮显示下表第一行的内容。 解决:开始》条件格式》突出显示单元格规则》小于="id5" 原博客各种作……所以换阵地了,不过每篇都搬过来,实在有点累,想看就自己看吧:http://blog.sina.com.cn/pureiceshadow

项目压测数据

压测流程首先启动 locust 压测脚本 然后启动bus查分模拟脚本 收集数据 压测结束,清理数据采集的数据为:请求相关数据,如响应时间,请求总数据量 资源相关,请求时pod的数量以及实时cpu,内存消耗 请求数量数量,总请求数量,时间分布 apm请求记录,查询请求具体耗时 数据库信…

认识mtv

MTV设计模式 那么 Django 的 MTV 又是怎么回事呢?下面讲解 Django 的设计模式。Django 借鉴了经典的 MVC 模式,它也将交互的过程分为了 3 个层次,也就是 MTV 设计模式;Model:数据存储层,处理所有数据相关的业务,和数据库进行交互,并提供数据的增删改查; Template:模板…

《机器学习的数学修炼》

目录:第六章 线性回归: 1.1三种方法实现:import numpy as np import pandas as pd from scipy import statsdf = pd.read_csv("DBS_SingDollar.csv") # X = df[df.columns[0]] # y = df[df.columns[1]] X = df["DBS"] Y = df["SGD"] slope,in…

变量

变量声明 在ES6以前我们通常通过var来声明变量。首先要进行变量声明,然后再进行使用 var num = 123;//声明变量num,并且赋值为123var声明多个变量 var a = 10, b = 20, c; console.log(delete c, delete b); // false false console.log(a, b, c); // 10 20 undefined// 通过…

内存颗粒, rank, chip, bank, row, column, page

【百度百科】中国港台地区把内存芯片叫做“内存颗粒”,其它芯片叫做“晶片”。百度翻译把“内存颗粒”译为"memory particle",用Bing国际版搜memory particle结果很少。 https://golerugged.com/article/284.htmlThe full name is Quad-Level Cell, a four-layer s…

蔚来杯2022牛客暑期多校训练营4 N-Particle Arts

问题描述 In a confined NIO space, there are nnn NIO particles, the iii-th of which has aia_iai​ joule energy. The NIO particles are very special as they keep colliding with each other randomly. When one particle carrying energy aaa joule collides with ano…

【SpringBoot】定时任务

SpringBoot实现定时任务 SpringBoot创建定时任务,目前主要有以下三种实现方式:基于注解(@Scheduled): 基于注解@Scheduled默认为单线程,开启多个任务时,任务的执行时机会受上一个任务执行时间的影响; 基于接口(SchedulingConfigurer): 用于实现从数据库获取指定时间来…

蔚来杯2022牛客暑期多校训练营2 G-Link with Monotonic Subsequence

问题描述 First, lets review some definitions. Feel free to skip this part if you are familiar with them. A sequence aaa is an increasing (decreasing) subsequence of a sequence bbb if aaa can be obtained from bbb by deletion of several (possibly, zero or al…

基于NFS实现pod数据持久化

一、nfs-server服务端:挂载一块新磁盘1.1、格式化并挂载parted /dev/vdb mklable xfs parted /dev/vdb primay 0% 100% mkfs.xfs /dev/vdb1 echo "/dev/vdb1 /nfs_share xfs defaults 0 0" >> /etc/fstab mount -a 1.2、安装nfs服务apt install nfs-kernel-s…

Mybatis的缓存

1. Mybatis的一级缓存 Mybatis的一级缓存是默认开启的,你只要搭建一个Mybatis框架,就可以直接使用一级缓存。 一级缓存是SqlSession级别的,通过SqlSession查询的数据会被缓存,下次使用同一个SqlSession查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问,减轻数…

2022年多校冲刺NOIP联训测试13 51nod2023省选联训 第三场

A 隔离 二分答案,简单\(check\)一下即可code #include<cstring> #include<algorithm> #include<cstdio> #include<queue> #include<vector> #include<set> #include<map> #include<iostream> #include<random>using na…

低风险稳健策略:BTC套利策略

更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流。 币安零手续费带来的机会 从7月8日的20点开始,币安推出了BTC现货交易零手续费的优惠活动,不论是Maker还是Taker都不收取手续费。此次活动包括了交易量最大的BTC/USDT和BTC/BUSD。BT…

适用于ps的Raw格式图像插件

Adobe Camera Raw14 中文版是适用于ps的Raw格式图像插件,安装上Camera Raw插件能在PS中打开编辑RAW格式文件,可以说是专业摄影师必备工具。目前Adobe Camera Raw中文版已经支持大部分主流相机,可以让用户在PS中处理各种形态的RAW文件。 软件下载地址 Camera Raw 软件是作为一…

AJAX概念和AJAX实现_原生JS方式

AJAX概念:概念:ASynchronous JavaScript And XML 异步的JavaScript和XML AJAX是一种在无需重新加载整个网页的情况下能够更新部分网页的技术。通过在后台于服务器进行少量数据叫唤,Ajax可以使网页实现异步更新,这意味着可以在不重新加载整个网页的情况下,对网页的某部分进…