首页 > 其他分享 >字符串哈希

字符串哈希

时间:2023-12-09 15:46:22浏览次数:20  
标签:const 哈希 int scanf ULL 字符串

单哈希且用自然溢出代替取模操作,常数小但是容易被卡

单字符串区间内比较

typedef unsigned long long ULL;

const int N = 100010, P = 131;

int n, m;
char str[N];
ULL h[N], p[N];

ULL get(int l, int r)
{
    return h[r] - h[l - 1] * p[r - l + 1];
}

int main()
{
    scanf("%d%d", &n, &m);
    scanf("%s", str + 1);

    p[0] = 1;
    for (int i = 1; i <= n; i ++ )
    {
        h[i] = h[i - 1] * P + str[i];
        p[i] = p[i - 1] * P;
    }

    while (m -- )
    {
        int l1, r1, l2, r2;
        scanf("%d%d%d%d", &l1, &r1, &l2, &r2);

        if (get(l1, r1) == get(l2, r2)) puts("Yes");
        else puts("No");
    }

    return 0;
}
# 字符串双哈希,多字符串互相比较
const int mod = 998244353;
const ull mod1=212370440130137957ll;
const ull mod2=(1<<30);
const int base=233333;
const double eps = 1e-8;
int n, m;



struct node{ull x,y;
    bool operator < (const node& a)const{
        return a.x==x?a.y<y:a.x<x;
    }
}f[N];
ull hash1(string s){
	const int base1=1313131;
    ull ans=0,len=s.size();
    for(int i=0;i<len;++i)ans=(ans*base1+(ull)s[i])%mod1;
    return ans;
}
ull hash2(string s){
    ull ans=0,len=s.size();
    const int base2=233333;
    for(int i=0;i<len;++i)ans=(ans*base2+(ull)s[i])%mod2;
    return ans;
}
void solve(){
	cin>>n;
	for(int i=1;i<=n;i++){
		string s;
		cin>>s;
		f[i].x=hash1(s);
		f[i].y=hash2(s);
	}
	sort(f+1,f+n+1);
	int ans=0;
	for(int i=1;i<=n;i++){
		if(f[i].x==f[i+1].x&&f[i].y==f[i+1].y)continue;
		else ans++;
	}
	cout<<ans<<endl;
	
}

标签:const,哈希,int,scanf,ULL,字符串
From: https://www.cnblogs.com/mathiter/p/17891038.html

相关文章

  • java获取字符串最后一个字符
    要获取字符串的最后一个字符,你可以使用以下方法之一:方法1:使用charAt()方法Stringstr="HelloWorld";charlastChar=str.charAt(str.length()-1);System.out.println("最后一个字符是:"+lastChar);方法2:使用substring()方法Stringstr="HelloWorld";StringlastC......
  • python 字符串的常用内置函数(后续遇到会继续更新)
    python字符串的内置常用方法(后面会继续更新)​ find方法(查找)#查找子字符串s="helloworld"print(s.find("world"))#输出:6print(s.find("earth"))#输出:-1#指定查找范围s="helloworld"print(s.find("o",6,9))#输出:7,在范围[6,9]内查找&......
  • 字符串练习
    字符串练习练习2.3个性化消息name='eric'text='wouldyouliketolearnsomePythontoday?'message=f"Hello{name.title()},{text}"print(message)​​‍练习2.4调整名字大小写first_name='Key'last_name='kilo'full_n......
  • **第四章 字符串****part02**
    第四章字符串**part02**    28.找出字符串中第一个匹配项的下标 题目链接:https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/  暴力法Code:classSolution{public:  intstrStr(stringhaystack,stringneedle)......
  • mybatis动态sql将字符串转换成数字类型报错
    报错信息org.mybatis.spring.MyBatisSystemException:nestedexceptionisorg.apache.ibatis.exceptions.PersistenceException: ###Errorqueryingdatabase.Cause:java.lang.NumberFormatException:Forinputstring:"xxx" ###Cause:java.lang.NumberFo......
  • 这就解释了tuple("单个多字符字符串") type==tuple, 其实是字符串被拆分到元组中, 以
    #单个多字符字符串拆分list("单个多字符字符串")tuple("单个多字符字符串")set("单个多字符字符串")#重新排序#dict不行ValueError:dictionaryupdatesequenceelement#0haslength1;2isrequiredlist("单个多字符字符串",)tuple("单个多字符字符串",)set("......
  • java JSON对象与字符串间的转换
    importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONObject;//字符串转为JSON对象StringstrParam="{\"callerid\":\"013941128270\",\"timestart\":\"2021-07-2709:37:42\",\"status\"......
  • day8、9字符串代码随想录
    第四章字符串●344.反转字符串●541.反转字符串II●卡码网:54.替换数字●151.翻转字符串里的单词●卡码网:55.右旋转字符串1反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组char[]的形式给出。不要给另外的数组分配额外的空间,你必须......
  • 【OpenSSL】哈希、非对称加密和对称加密函数使用
    1.哈希1.1md5的使用头文件#include<openssl/md5.h>#include<openssl/sha.h>MD5散列值的长度#defineMD5_DIGEST_LENGTH16//根据这个分配一块空内存保存散列值初始化MD5->给MD5传入运算的数据(可以多次传入)->计算MD5#defineMD5_DIGEST_LENGTH1......
  • 优雅提效:Guava的字符串处理工具
    第1章:引言大家好,我是小黑,今天咱们要聊一聊GoogleGuava这个超棒的Java库,尤其是它的字符串处理工具。对于Java程序员来说,字符串处理是日常工作的一部分,而Guava在这方面提供了非常强大的支持。使用Guava处理字符串不仅可以提高效率,而且代码会更简洁、更优雅。Guava库由Google开发......