【无标题】

​作者:小妮无语
专栏:一日一题
‍♀️✌️道阻且长,不要放弃✌️‍♀️

​今天主要发现两个很好用的结构,想做个记录

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
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
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ㄒ)/~~
把边界一放,嘎嘎香,以字符串存储,直接就可以比较
虽然这个还是会超时,但是应付一下也是可以的,等我过几天学学正规做法。

欢迎来到一日一题的小菜鸟频道,睡不着就看看吧!
跟着小张刷题吧!

你可能感兴趣的:(一日一题,算法,哈希算法,数据结构)