ニャー雲荘喵の云的雪

字符串哈希笔记

CloudCat·2022-05-25 21:52·40 次阅读

字符串哈希笔记

字符串哈希

基础知识#

字符串哈希 - OI Wiki (oi-wiki.org)

哈希碰撞#

大白话解释hash碰撞是什么以及如何解决

#

【模板】字符串哈希

题目描述#

如题,给定 N 个字符串(第 i 个字符串长度为 Mi,字符串内包含数字、大小写字母,大小写敏感),请求出 N 个字符串中共有多少个不同的字符串。

友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转PJ试炼场:)

输入格式#

第一行包含一个整数 N,为字符串的个数。

接下来 N 行每行包含一个字符串,为所提供的字符串。

输出格式#

输出包含一行,包含一个整数,为不同的字符串个数。

样例 #1#

样例输入 #1#

Copy
5
abc
aaaa
abc
abcc
12345

样例输出 #1#

Copy
4

提示#

30%N10Mi6Mmax15

70%N1000Mi100Mmax150

100%N10000Mi1000Mmax1500

样例说明:

样例中第一个字符串(abc)和第三个字符串(abc)是一样的,所以所提供字符串的集合为{aaaa,abc,abcc,12345},故共计4个不同的字符串。

Tip:
感兴趣的话,你们可以先看一看以下三题:

BZOJ3097:http://www.lydsy.com/JudgeOnline/problem.php?id=3097

BZOJ3098:http://www.lydsy.com/JudgeOnline/problem.php?id=3098

BZOJ3099:http://www.lydsy.com/JudgeOnline/problem.php?id=3099

如果你仔细研究过了(或者至少仔细看过AC人数的话),我想你一定会明白字符串哈希的正确姿势的_

Copy
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M = 1e9 + 7;
const int B = 233;
ll hashNum;
set<ll>ds;
int main()
{
string str;
int t;
cin >> t;
for (int j = 1; j <= t; j++) {
cin >> str;
hashNum = 0;
for (int i = 0; i < str.length(); i++) {
hashNum = (ll)(hashNum * B + str[i]) % M;
}
ds.insert(hashNum);
}
cout << ds.size() << endl;
return 0;
}

遇到哈希碰撞?

当B=7时WA第9个测试点:Answer9520//out_put9519

当B=233时WA最后一个测试点:Answer9142//out_put9141

当B=19260817AC

posted @   cloudcat233  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示
目录