哈希表

模拟离散表

#include <bits/stdc++.h>
using namespace std;
const int N = 200003, null = 0x3f3f3f3f;
//N表示哈希表要映射的范围,一般为1e5左右
//根据不同的方法给定的的N值有所不同
//开放寻址法一般为范围的2-3倍,拉链法1倍即可
//N的取值一般为一个大于指定范围的素数,数学上可以证明这种方式是可能发生冲突最少的
int h[N];
//find函数是开放寻址法的核心,一般哈希表的时间复杂度都为O(1)
int find(int x)
{
    int t = (x % N + N) % N;          //注意要把t映射成一个正值
    while (h[t] != null && h[t] != x) //如果数组存满了的话就会死循环
    {
        t++;
        if (t == N)
            t = 0; //搜映射值得后面,再搜索前面
    }
    return t;
}
int main()
{
    memset(h, 0x3f, sizeof(h)); //将哈希数组初始化成默认值null
    int n;
    scanf("%d", &n);
    while (n--)
    {
        char op[2];
        int x;
        scanf("%s%d", op, &x);
        if (*op == 'I')
            h[find(x)] = x;
        else
        {
            if (h[find(x)] == null)
                cout << "No" << endl;
            else
                cout << "Yes" << endl;
        }
    }
    return 0;
}

字符串哈希
将一个字符串看成一个数字给每一位赋值一个权值进行计算,得到哈希值
通过比较哈希值来完成一系列操作

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull; //采用此数据类型可以避免去摸运算
//一般来讲取模2^64即unsigned long long的极限范围自动完成取模
const int N=1e5+10,P=131; //每一位对应权值为131或者13331
//当取模2^64,权值为131或者13331,认为人品极限牛逼,没有冲突,哈希值相同等价于字符串相同
char str[N]; //注意不能将任何一个字符的哈希值规定成0
ull h[N]; //用来存储字符串中第i个字符之前的串的哈希值
ull p[N]; //用来存储对应位的权值
ull get(int l,int r)
{
    return h[r]-h[l-1]*p[r-l+1]; //利用公式可以得到给定任意位置的字串的哈希值
}
int main()
{
    int m,n;
    cin>>m>>n;
    cin>>str+1;
    p[0]=1;
    for(int i=1;i<=m;i++)
    {
        p[i]=p[i-1]*P;
        h[i]=h[i-1]*P+str[i];
    }
    while(n--)
    {
        int l1,r1,l2,r2;
        cin>>l1>>r1>>l2>>r2;
        if(get(l1,r1)==get(l2,r2)) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值