首页 > 其他分享 >哈希

哈希

时间:2023-08-03 17:25:14浏览次数:29  
标签:cnt return idx int scanf 哈希

数字哈希

用于单点修改及数字查询,期望复杂度均摊O(n),核心在于建一个链表结构,将读入数据取模一个较大值并以此值作为链表行,存储行头,相临值编号及编号对应值,在查询时直接访问行即可,模板:

#include<bits/stdc++.h>
using namespace std;
const int N = 100005,M = 99991;
int hd[M],nxt[N],val[N],idx = 1,a,n;
char s[2];
void add(int x){
int cnt = (x%M+M)%M;
val[idx] = x;
nxt[idx] = hd[cnt];
hd[cnt] = idx;
}
bool query(int x){
int cnt = (x%M+M)%M;
for(int i = hd[cnt];i;i = nxt[i]){
if(val[i] == x) return true;
}
return false;
}
int main(){
scanf("%d",&n);
for(int i = 1;i <= n;i++){
scanf("%s",s);
if(s[0] == 'I'){
scanf("%d",&a);
add(a);
}else{
scanf("%d",&a);
if(query(a)) printf("Yes\n");
else printf("No\n");
}
idx++;
}
return 0;
}

字符串哈希

用于解决字符串的匹配及查询问题,衍生用法可查询循环节(不过KMP可以更简单地实现此效果)。时间复杂度O(m+n),方法核心在于将字符串按位转化为一个数字,类似于十进制转二进制,再将该值进行匹配

 如图即为匹配成功

该值基本具有唯一性(其余情况出现概率极小,所以可以放心用),由于该值较大且确保为正数,我们可以使用unsigned long long进行储存,代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N = 1000005,P = 131;
int t,ans,l1,l2;
ull hs1[N],hs2[N],p[N];
char s1[10005],s2[1000005];
int main(){
scanf("%d",&t);
p[0] = 1;
for(int i = 1;i <= N;i++) p[i] = p[i-1]*P;//预处理p数组
for(int i = 1;i <= t;i++){
ans = 0;
cin >> (s1+1) >> (s2+1);
l1 = strlen(s1+1);
l2 = strlen(s2+1);
for(int i = 1;i <= l1;i++) hs1[i] = hs1[i-1]*P+s1[i];
for(int i = 1;i <= l2;i++) hs2[i] = hs2[i-1]*P+s2[i];
for(int i = l1;i <= l2;i++) if(hs1[l1] == hs2[i]-hs2[i-l1]*p[l1]) ans++;//匹配过程
printf("%d\n",ans);
}
return 0;
}

 

标签:cnt,return,idx,int,scanf,哈希
From: https://www.cnblogs.com/breeze-zyh/p/17603880.html

相关文章

  • 白话解析:一致性哈希算法 consistent hashing
    在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那么,我们先来描述一下这个经典的分布式缓存的应用场景。场景描述假设,我们有三台缓存服务器,用于缓存图片,我们为这三台......
  • 什么是哈希?
    Refhttps://blog.dvsj.in/hashing/......
  • 哈希表
    哈希表作用:将庞大的空间,映射到小的空间,集中数据,一般用取模,取模的数尽量取质数,最大程度减小冲突操作:一般是添加和查找元素,删除元素通常有一个标记数组,对元素标记为已删除离散化相似,离散化是特殊的哈希方式,离散化处理的数据是单调的,相对位置不变映射会出现冲突,如将两个不同......
  • [代码随想录]Day05-哈希表 part01
    题目:242.有效的字母异位词思路:很简单,就是看两个字符串每个字母出现的次数是不是相同的。可以用两个数组来比较,也可以用一个数组比较。代码:一个数组funcisAnagram(sstring,tstring)bool{isExist:=[26]int{}//26个字母for_,ch:=ranges{isE......
  • 代码随想录-哈希表-c++总结
    哈希表内容整体简单,关键是要有利用map映射的思想,以及巩固一些c++标准库的操作这次三数之和一题没有直接做出来,关键在于如何查重一点比较绕15.三数之和-力扣(LeetCode)利用排序+双指针解决三数之和的思路更加清楚此外,四数之和中,四个数相加会溢出int,应改为 ......
  • 哈希函数如何工作 ?
    动动发财的小手,点个赞吧!作为一名程序员,您每天都会使用哈希函数。它们在数据库中用于优化查询,在数据结构中用于使速度更快,在安全性中用于保证数据安全。几乎每次与技术的交互都会以某种方式涉及哈希函数。哈希函数是基础函数,而且无处不在。但什么是哈希函数,它们如何工作?在这篇文......
  • 【算法】哈希学习笔记
    1.哈希(hash)简介1.1前言又来写算法总结了qwq。今天是2023/7/8,期末考试已经考完了。初二下注定是一个煎熬的学期,所以我在这一学期并没有学什么新算法,OI也没什么长进。但倒是深造了几个算法,比如:dp,hash,线段树。之前一直想写一篇hash的学习笔记,但由于种种原因,并没有写成。于......
  • 41. 缺失的第一个正数(原地哈希)
    给你一个未排序的整数数组nums,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为O(n)并且只使用常数级别额外空间的解决方案。示例1:输入:nums=[1,2,0]输出:3>思路原地哈希就相当于,让每个数字n都回到下标为n-1的家里。而那些没有回到家里的就成了孤魂野鬼......
  • Template <字符串哈希>
    #include<iostream>#include<string>#include<vector>usingnamespacestd;usingULL=unsignedlonglong;//字符串哈希(注意get(l,r)为闭区间,字符串下标从1开始)structStringHash{vector<ULL>h;//哈希数组vector<ULL>p;//p[i]=P......
  • 在Java和C#中计算SHA-1哈希
    Java版本:publicvoidtestHash(){Stringpassword="Test";byte[]key=password.getBytes();MessageDigestmd=MessageDigest.getInstance("SHA-1");byte[]hash=md.digest(key);Stringresult="";for(byteb:hash){res......