字符串哈希

一般OI可以直接用unordered容器,基本等复杂度,而且更快,更稳,不过哈希的思想十分重要,还是建议学一下

主要用到哈系思想,将不同字符串与对应数字组成key-value的形式

常用于判断一个字符串是否出现过,或者出现几次

自然溢出法:

用质数是为了防止重复

long long 范围是-2^63 —— 2^63-1

unsigned long long 范围是 0 —— 2^64-1

一般用unsigned long long,因为不需要使用负数

unsigned long long idx(char s)
{
    return s;
}

void get_hash(string s)
{
    Hash.push_back(0);
    for(int i = 0;i < s.size();++i) Hash.push_back(Hash.back() * Base + idx(s[i]));
}

单哈希

在自然溢出法中将字符 * 一个质数后 mod 一个超级大的质数(防止溢出)

unsigned long long idx(char s)
{
    return s;
}

void get_hash(string s)
{
    Hash.push_back(0);
    for(int i = 0;i < s.size();++i) Hash.push_back((Hash.back() * Base %  + idx(s[i])) % 假装这是一个超级大的质数);
}

双哈希

哈希值为pair<long long,long long>的一个键值对

由两个Base构成,基本不会产生哈希冲突

long long MOD1 = 1e9 + 7;
long long MOD2 = 1e9 + 9;
unsigned long long Base1 = 3;
unsigned long long Base2 = 3;

vector<pair<long long,long long>> Hash;

long long idx(char c)
{
    return c - 'a' + 1;
}

void get_hash(string s)
{
    Hash.push_back({0,0});
    for(char c : s) Hash.push_back({(Hash.back().first * Base1 + idx(c)) % MOD1,(Hash.back().first * Base2 + idx(c)) % MOD2});
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值