首页 > 其他分享 >字符串Hash

字符串Hash

时间:2023-02-17 17:34:56浏览次数:30  
标签:hash int DNA long 兔子 字符串 Hash


  Hash

 

  概念

        字符串hash函数把一个任意长度的字符串映射成一个非负整数, 并且 冲突概率很小 . 

        取一个固定值 p ,把字符串看作 p 进制数 , 并分配一个大与 0 的 数值, 代表每种字符 给定一个字符串S=s1s2s3..sn,对字母x,我们规定idx(x)=x−′a′+1。一般来说 ,我们p的值取 131 或者 13331 ,此时 Hash 值产生冲突的概率极低 ,只要hash 值相同我们就可以认为两个字符串是相等的. 然后还有一个固定值 M ,求出p 进制数对 M的余数,作为字符串的hash 值. 通常 M 取 

字符串Hash_字符串

 , 即直接使用 unsigned long long 类型存储这个 hash 值, 在计算时不处理算数溢出问题 ,产生溢出时相当于自动对 

字符串Hash_字符串

 取模, 这样可以避免低效的取模运算 。

  求字符串的哈希值

   如果我们已经知道字符串 s 的 hash 值为 H(s) , 比如 "abcd" . 那么它的 hash 值为 ( s[0] -'a'+1) *p^3 +(s[1] -'a' +1)*p^2 + (s[2]-'a'+1)*p^1 +(s[3]-'a'+1)*p^0   , 其中 p 可以取 131 或者 13331 . 

如果 s1 = 'e' ;

那么 hash (s+s1) = hash(s)*P +4;

如果已知字符串 S 的hash值为H(S) , 新字符串 S+T 的hash 值为 H(S+T) , 那么 H(T) =(H(S+T) -H(S)*p^(length(T)) mod M ; 

例题  138. 兔子与兔子

很久很久以前,森林里住着一群兔子。

有一天,兔子们想要研究自己的 DNA 序列。

我们首先选取一个好长好长的 DNA 序列(小兔子是外星生物,DNA 序列可能包含 26 个小写英文字母)。

然后我们每次选择两个区间,询问如果用两个区间里的 DNA 序列分别生产出来两只兔子,这两个兔子是否一模一样。

注意两个兔子一模一样只可能是他们的 DNA 序列一模一样。

输入格式

第一行输入一个 DNA 字符串 S。

第二行一个数字 m,表示 m 次询问。

接下来 m 行,每行四个数字 l1,r1,l2,r2,分别表示此次询问的两个区间,注意字符串的位置从1开始编号。

输出格式

对于每次询问,输出一行表示结果。

如果两只兔子完全相同输出 Yes,否则输出 No(注意大小写)。

数据范围

1≤length(S),m≤10000001≤length(S),m≤1000000

输入样例:

aabbaabb
3
1 3 5 7
1 3 6 8
1 2 1 2

输出样例:

Yes
No
Yes
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std ;
typedef long long LL ;
const int MAX = 1000010 ;
typedef unsigned long long ULL ;
char s[MAX] ;
ULL f[MAX], p[MAX] ;

int main(){
int n ,q ;
scanf("%s",s+1);
p[0] = 1 ;
cin >> n ;

for(int i = 1 ; i<=strlen(s+1) ; i++ ) {
f[i] = f[i-1] *131+(s[i]-'a'+1) ;
p[i] = p[i-1]*131 ;
}
for(int i = 1 ; i<=n ; i++) {
int l1 ,r1 , l2 ,r2 ;
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);

if(f[r1]-f[l1-1]*p[r1-l1+1] == f[r2]-f[l2-1]*p[r2-l2+1]){
cout<<"Yes"<<endl ;
}
else{
cout<<"No"<<endl ;
}
}

return 0 ;
}

 

 

 

 

标签:hash,int,DNA,long,兔子,字符串,Hash
From: https://blog.51cto.com/u_15970235/6064425

相关文章

  • 2、HashMap源码分析
    目录1一般数据结构及特点2HashMap基本属性说明3HashMap数据结构3.1构造函数3.2Node<k,v>分析4put过程分析4.1扩容方法resize()分析4.2put方法分析5关于HashMap5.1......
  • 【牛客网】字符串分隔
    题目描述•输入一个字符串,请按长度为8拆分每个输入字符串并进行输出;•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。输入描述:连续输入字符串(每个字符串......
  • 【牛客网】字符串的最后一个单词的长度
    题目描述计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)输入描述:输入一行,代表要计算的字符串,非空,长度小于5000。输出......
  • 滑动窗口算法-找出字符串中无重复的最长字符串
    functionlengthOfLongestSubstring($s):string{$max=0;//返回结果,初始化为0$len=strlen($s);//传入的字符串长度$str='';//维护的滑动窗口......
  • 字符串
    final字符串连接/*!!!!!!final字符串连接+*/@TestpublicvoidfianlStringTest(){finalStringstr2="a";finalStringstr3="b";......
  • 字符串的排列
    字符串的排列给你两个字符串 s1 和 s2,写一个函数来判断s2是否包含s1 的排列。如果是,返回true;否则,返回false。换句话说,s1的排列之一是s2的子串。示例......
  • node:internal/crypto/hash:71 this[kHandle] = new _Hash(algorithm, xofLen);
    D:\Node\node.exeD:\Node\node_modules\npm\bin\npm-cli.jsrunstart:dev--scripts-prepend-node-path=auto>[email protected]:dev>cross-envREACT_AP......
  • String hashcode()
    Stringhashcode()代码段publicinthashCode(){inth=hash;if(h==0&&value.length>0){charval[]=value;......
  • HashMap
    JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。JDK1.8以后在解决哈希冲突时有了较大的变化,当......
  • HashSet
    HashSet基于HashMap来实现的,是一个不允许有重复元素的集合;HashSet允许有null值;HashSet是无序的,即不会记录插入的顺序;HashSet不是线程安全的;HashSet实现了Set接口......