作者:小妮无语
专栏:一日一题
🚶♀️✌️道阻且长,不要放弃✌️🏃♀️
今天主要发现两个很好用的结构,想做个记录
目录
- 1.模拟散列表
- 代码
- 2.字符串哈希
- 代码
1.模拟散列表
题目描述·
维护一个集合,支持如下几种操作:
I x,插入一个数 x;
Q x,询问数 x是否在集合中出现过;
现在要进行 N 次操作,对于每个询问操作输出对应的结果。
输入格式
第一行包含整数 N,表示操作数量。
接下来 N 行,每行包含一个操作指令,操作指令为 I x,Q x 中的一种。
输出格式
对于每个询问指令 Q x,输出一个询问结果,如果 x 在集合中出现过,则输出 Yes,否则输出 No。
每个结果占一行。
数据范围
1≤N≤10^5
−10^9 ≤x≤10^9
输入样例:
5
I 1
I 2
I 3
Q 2
Q 5
输出样例:
Yes
No
代码
#include<bits/stdc++.h>
using namespace std;
map<int,int>m;
char a[2];
int q;
int main()
{cin>>q;while(q--){int x;scanf("%s%d",a,&x);if(a[0]=='I'){m[x]=1;}else{if(m[x]==1)puts("Yes");else puts("No");}}return 0;
}
map< >之前没做到过,好香,我只能说,它不用你初始化长度
1.可以将任何基本类型映射到任何基本类型。如int
array[100]事实上就是定义了一个int型到int型的映射。
2.map提供一对一的数据处理,key-value键值对,其类型可以自己定义,第一个称为关键字,第二个为关键字的值
3.map内部是自动排序的
2.字符串哈希
题目描述·
给定一个长度为 n 的字符串,再给定 m 个询问,每个询问包含四个整数 l1,r1,l2,r2,请你判断 [l1,r1]和 [l2,r2] 这两个区间所包含的字符串子串是否完全相同。
字符串中只包含大小写英文字母和数字。
输入格式
第一行包含整数 n 和 m,表示字符串长度和询问次数。
第二行包含一个长度为 n 的字符串,字符串中只包含大小写英文字母和数字。
接下来 m 行,每行包含四个整数 l1,r1,l2,r2,表示一次询问所涉及的两个区间。
注意,字符串的位置从 11 开始编号。
输出格式
对于每个询问输出一个结果,如果两个字符串子串完全相同则输出 Yes,否则输出 No。
每个结果占一行。
数据范围
1≤n,m≤10^ 5
输入样例:
8 3
aabbaabb
1 3 5 7
1 3 6 8
1 2 1 2
1
2
3
4
5
输出样例:
Yes
No
Yes
代码
#include<bits/stdc++.h>
using namespace std;int main()
{int n,m;string s;cin>>n>>m>>s;string t,u;while(m--){int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);t=s.substr(a-1,b-a+1);u=s.substr(c-1,d-c+1); if(t==u) puts("Yes");else puts("No");} return 0;
}
substr!!!锤爆,我本来差一点,就准备遍历了,/(ㄒoㄒ)/~~
把边界一放,嘎嘎香,以字符串存储,直接就可以比较
虽然这个还是会超时,但是应付一下也是可以的,等我过几天学学正规做法。
欢迎来到一日一题的小菜鸟频道,睡不着就看看吧!