洛谷P3370 【模板】字符串哈希

《洛谷深入浅出基础篇》 p3370字符串哈希——hash表 开一个10^6的数组,然后出现哪个数字,标记哪个数字就行了。这样的话,如果所有的字符串的ascii码之和都是相同的,那么时间复杂度将爆炸,很容易被hack。就是说,给你N个字符串,然后让你判断,这N个字符串里面有多少不同的字符串(用hash做)假如这个数据类型是字符串,我们就可以用字符串里面的每个字符的ascii码来求哈希值,但是显然,如果取模1007的话,显然是可能会有很多重复的情况,我们叫做”哈希碰撞“将这个问题简化,比如,给你10^6个数字,然后让你计算一下有多少不同的数字。 阅读详情

一定要记住HASH链表的高端写法!!!
参考了ywq大佬的写法,原来的自己乱搞版WA了70分……

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ull unsigned long long
const int base1=1000007,base2=99859,MOD=69847;
int cnt=0,len;
int head[MOD+2],nxt[10000+5],etot;
char s[1505]; 
struct node{
	ull f,s;
}val[10000+5];
int ha(int from,ull hash1,ull hash2)
{
	for(int i=head[from];i;i=nxt[i])
		if(val[i].f==hash1&&val[i].s==hash2) return 0;
	val[++etot].f=hash1,val[etot].s=hash2;
	nxt[etot]=head[from];
	head[from]=etot;
	return 1;
}
void Hash(int len)
{
	ull hash1=1,hash2=1;
	for(int i=1;i<=len;i++){
		hash1=(hash1+s[i])*base1;
		hash2=hash1*base2;
	}
	cnt+=ha((hash2%MOD+MOD)%MOD,hash1,hash2);
}
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%s",s);
		len=strlen(s);
		Hash(len);
	}
	printf("%d",cnt);
	return 0;
}

ywq大佬的原版

#include<bits/stdc++.h>
#define uint unsigned int
using namespace std;

const int N = 10000 + 10;
const int M = 1500 + 10;
const int mod = 10000007;

int n,cnt=0;
char s[M];

struct node{
    int pre;
    uint hash1,hash2;
}stb[N];

int num=0,head[mod+3];
int link(int from,uint hash1,uint hash2){
    for(int i=head[from];i;i=stb[i].pre)
        if(stb[i].hash1==hash1&&stb[i].hash2==hash2) return 0;
    stb[++num].pre=head[from],stb[num].hash1=hash1,stb[num].hash2=hash2;
    head[from]=num;
    return 1;
}

void hash(int len){
    uint seed=31,hash1=0;
    for(int i=0;i<len;++i) hash1=hash1*seed+s[i];
    
    uint hash2=0;
    for(int i=0;i<len;++i){
        if(i&1) hash2^=(~((hash2<<11)^s[i]^(hash2>>5)));
        else hash2^=((hash2<<7)^s[i]^(hash2>>3));
    }
    cnt+=link(hash1%mod,hash1,hash2);
}

int main(){
    scanf("%d",&n);
    while(n--){
        scanf("%s",s);
        int len=strlen(s);
        hash(len);
    }
    printf("%d\n",cnt);
    return 0;
}
【题解-洛谷】P3370 【模板】字符串哈希 如题,给定N个字符串(第i个字符串长度为Mi​,字符串内包含数字、大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串。 阅读详情

相关推荐

洛谷 P3370【模板】字符串哈希

一、题目描述 题目提供者 HansBug 难度 普及- 标签 高性能 题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字、大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串。 #友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转PJ试炼场:) 输入格式 第一行包含一个整数N,为字符串的个数。 接下来N行每行包含一个字符串,为所提供的字符串。 输出...

COFACTOR 573

P3370 【模板】字符串哈希

如题,给定 N 个字符串(第 i 个字符串长度为 Mi​,字符串内包含数字、大小写字母,大小写敏感),请求出 N 个字符串中共有多少个不同的字符串。对于 100% 的数据:N≤10000,Mi​≈1000,Mmax≤1500。对于 70% 的数据:N≤1000,Mi​≈100,Mmax≤150。对于 30% 的数据:N≤10,Mi​≈6,Mmax≤15。接下来 N 行每行包含一个字符串,为所提供的字符串。输出包含一行,包含一个整数,为不同的字符串个数。第一行包含一个整数 N,为字符串的个数。

m0_67717626的博客 321

CDO批量处理nc文件:5分钟搞定CMIP6数据双线性插值(附完整代码)

本文详细介绍了如何使用CDO工具链中的`remapbil`命令,快速实现CMIP6数据的批量双线性插值处理。通过环境配置、核心操作步骤、高级优化技巧及典型报错解决方案,帮助科研人员高效处理大规模nc文件,显著提升气象数据处理效率。

weixin_29267307的博客 293

[洛谷]P3370 【模板】字符串哈希

嘎嘎模板,嘎嘎清晰,冲吧战士们

m0_74969835的博客 356

STM32外围电路硬件解析

复位 :让MCU回到最开始的状态。并且从头开始,重新执行程序 我们什么时候需要复位? 1.烧录的时候 2.程序跑飞了的时候 3.上电复位(上电的时候需要复位) 复位方式: 1.上电复位: --- 一定要有 MCU的Reset是复位引脚,当这个引脚为低电平时,

qq_39577221的博客 1万+

优雅谈大模型:“System2”与“System 1”

研究人员探索了三种System 2方法——RaR、S2A 和 BSM,这些方法已经成功提炼到新的LLM,这个新的模型与System 1相比,产生了更好的结果,而且成本低于System 2。然而这种方法是有局限性,只能适用于特定的任务。

鲁班模锤 5160

【每日一题】洛谷--P3370 【模板】字符串哈希 java题解

4.10每日打卡

d1006913064的博客 853

MinerU安装指南:从源码到验证的完整流程

本文详细介绍了MinerU文档转换工具的安装流程,从源码获取、依赖安装到验证步骤,提供了完整的安装指南和常见问题解决方案。特别适合技术写作者和开发者快速部署这款高效的文档转换工具,提升工作效率。

weixin_29243279的博客 546

洛谷P3370 【模板】字符串哈希(c嘎嘎)

解题思路:利用哈希算法,将每一个字符串映射到一个值域较小、可以方便比较的数,然后将哈希值存入到set(),最后输出set的大小。

2302_79431881的博客 714

halcon算子翻译——connection

算子:connection(Region : ConnectedRegions : : ) 功能:分离一个区域中相连接的部分(变成多个区域)。 输入参数: Region:输入一个区域; 输出参数: ConnectedRegions: ———————————————— 版权声明:本文为优快云博主「机器人自动化控制」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.youkuaiyun.com/haier123888/article/details/1

haier123888的博客 4829

S7-1500——(一)西门子PLC编程算法及程序设计1、拆解基本算法(一)

顺序队列也是一种操作受限的线性表,在一端添加数据,另一端取出数据,符合先进先出的特性工作过程:需要两个指针来指向存取元素的位置(头指针,尾指针)如下图头指针指向队列里边第一个元素位置(即下次出队元素所在的位置)尾指针是指向队列内最后一个元素的下一个位置(即下次要入队的元素要存放的位置)空队状态:最初始状态,队列没有任何元素,头指针和尾指针都指向队头,(由于没有任何元素,不能做出队操作,可进行入队操作)入队操作出队操作满队:一直入队,最终元素装满队列;满队后,虽然队列前面还有空间,但由于。

大小曲奇的博客 1609

洛谷 P3370 【模板】字符串哈希

样例中第一个字符串 abc 和第三个字符串 abc 是一样的,所以所提供字符串的集合为 {aaaa,abc,abcc,12345},故共计 4 个不同的字符串。如题,给定 N 个字符串(第 i 个字符串长度为 Mi​,字符串内包含数字、大小写字母,大小写敏感),请求出 N 个字符串中共有多少个不同的字符串。对于 100% 的数据:N≤10000,Mi​≈1000,Mmax​≤1500。对于 70% 的数据:N≤1000,Mi​≈100,Mmax​≤150。输出包含一行,包含一个整数,为不同的字符串个数。

2401_87918203的博客 199

手把手教你使用ConvNeXt训练自己数据集和推理,ConvNeXt模型训练(CVPR 2022),一个能挑战 Vision Transformer 的卷积神经网络,含完整代码和数据集

手把手教你使用ConvNeXt训练自己数据集和推理,ConvNeXt模型训练(CVPR 2022),一个能挑战 Vision Transformer 的卷积神经网络,含完整代码和数据集

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1451

【模板·字符串hash】 洛谷 P3370 【模板】字符串哈希

题目:字符串哈希 思路:模板题。 代码: #include&lt;bits/stdc++.h&gt; using namespace std; #define maxn 10000 #define read(x) scanf("%d",&amp;x) #define maxm 1500 #define ull unsigned long long #define P 131 int n; ch...

iwi 372

华为OD机考双机位C卷 - 朋友圈个数(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 朋友圈个数(OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 695

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

字符串Hash

字符串Hash原理,将字符串映射成一个值,是一个单向加密的过程。比较简单和常用的是进制哈希,我们把字符串看成是p进制数,然后使用unsigned long long的自然溢出(相当于是对264−12^{64}-1264−1取模),如果两个字符串的hash值相同,则可以认为两个字符串相同。 单个字符串的Hash值 要求长度为len的字符串str的Hash值 先预处理出一个pwd[]数组,pwd[i]表示pip^ipi。 Hash[]表示字符串的哈希值(p进制取模值)。显然有 Hash[i]=(Hash[i−1

陈颜的博客 3913

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

洛谷 P3370:【模板】字符串哈希

字符串哈希是一种将字符串转换为固定长度整数的技术,通过哈希值快速比较字符串的相等性或查找子串‌。其核心思想是将字符串视为基数为 B 的数,将子串的哈希计算转化为数值运算‌。

hnjzsyjyj的专栏 949

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【洛谷】P3370 【模板】字符串哈希

题目地址: https://www.luogu.com.cn/problem/P3370 题目描述: 如题,给定NNN个字符串(第iii个字符串长度为MiM_iMi​,字符串内包含数字、大小写字母,大小写敏感),请求出NNN个字符串中共有多少个不同的字符串。 输入格式: 第一行包含一个整数NNN,为字符串的个数。接下来NNN行每行包含一个字符串,为所提供的字符串。 输出格式: 输出包含一行,包含一个整数,为不同的字符串个数。 数据范围: 对于30%30\%30%的数据:N≤10N≤10N≤10,Mi≈6M_

数学、算法爱好者的博客 1007

P3370 【模板】字符串哈希题解

题目摘要 本题要求统计N个字符串中不同字符串的数量。每个字符串可能包含数字、大小写字母(区分大小写),输入包含N行字符串,输出为不同字符串的个数。 解题思路 直接使用STL中的map容器来存储字符串 每次读取一个字符串,作为map的键插入 最后输出map的大小即为不同字符串的数量 这种方法利用map自动去重的特性,简单高效地解决了问题。 代码特点 虽然题目要求练习字符串哈希,但示例代码选择直接使用map容器来实现去重功能。代码中包含了大量被注释掉的冗余字符串声明,实际上核心逻辑非常简洁。

bz02_2023f2的博客 934

洛谷P3370 【模板】字符串hash

链接:P3370 题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字、大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串。 #友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转PJ试炼场:) 输入格式 第一行包含一个整数N,为字符串的个数。 接下来N行每行包含一个字符串,为所提供的字符串。 输出格式 输出包含一行,包含一个整数,为不同的字符串个数。 输入...

秃头交易站. 293
上一篇: P3371 【模板】单源最短路径 SPFA优化 dijkstra堆优化
下一篇: manacher板子 洛谷P3805
五彩蒟蒻DDD
博客等级 码龄10年 20粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值