首页 > 其他分享 >字符串哈希——洛谷P3370

字符串哈希——洛谷P3370

时间:2024-03-13 22:31:56浏览次数:25  
标签:map set 洛谷 string int 哈希 include P3370

1.简介

本文主要介绍三种实现哈希表的方法:进制哈希,set哈希,map哈希。

2.进制哈希

#include<iostream>
#include<vector>
#define mod 1000
using namespace std;

int n,hs,ans;
vector<string> a[mod];                        //数组开多大,取决于mod取多大
string s;                                     // a[n]等价于a(n),都是初始化vector一维大小

void f(string s)
{
	int i;
	for (i=0;i<s.size();i++)
		hs=(hs*130+s[i])/mod;                 //hs*130是为了进制转化,转化为130进制
	for (i=0;i<a[hs].size();i++)
		if (a[hs][i]==s)                      
			return;
	a[hs].push_back(s);                       //这就是为什么要用vector而不是简单的string a[mod],目的是为了方便加入元素。并不是为了用vector可变长的特性。
	ans++;
}

int main()
{
	int i;
	cin>>n;
	while (n--)
	{
		cin>>s;
		f(s);	
	}
	cout<<ans;
	return 0;
} 

为什么vector是一维,但这里出现了二维?

实际上 [ i ] 并不是vector的二维,而是 a [ hs ] —>string的一维,string[ 1 ] 里不仅可以存一个字符,也可以是一个字符串。

3.set哈希

这里用到了set的特性:无重复元素。若集合中已有该元素,则下次再出现则不会再添加

#include<iostream>
#include<set>
using namespace std;

set<string> se;

int main()
{
    string s;
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
    	cin>>s;
    	se.insert(p);
	}
	cout<<se.size();
    return 0;
}

4.map哈希

map实现基于键值对的hash。

重要的是键,下一次插入再碰到相同的键就不会再插入了。

至于键对应的值是多少都可以,用不到。

#include<iostream>
#include<map>
using namespace std;

map<string,int> m;

int main()
{
    string s;
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
    	cin>>s;
    	m[s]=1;
	}
	cout<<m.size();
    return 0;
}

标签:map,set,洛谷,string,int,哈希,include,P3370
From: https://blog.csdn.net/2301_81608637/article/details/136638448

相关文章

  • 二分+前缀和——洛谷P1314
    1.公式解读[...]  括号内内容为真则其值等于1,内容为假则其值等于0 2.思路这是一个关于单调性判定的问题,当W不断增大,差值由大变小再变大(实际是从负到0到正,只不过要取绝对值,不影响它的单调性),而目标则是在0的附近找到一个绝对值最小的值,因此是一道二分答案题,但如果......
  • 洛谷P6866 [COCI2019-2020#5] Emacs
    题目描述给定一个n×m 的只含有 . 和 * 的矩阵。矩阵中 * 形成一些不重叠的长方形。它们不在边缘或顶点接触。求长方形有多少个?输入格式第一行:两个正整数 n 和 m。以下 n 行:表示题目描述中的矩阵。矩阵只含有 . 和 *。输出格式一行一个非负整数,你的答......
  • C++:[NWRRC2015] Concatenation(洛谷)P7050
    题目描述FamousprogrammerGennadylikestocreatenewwords.Onewaytodoitistoconcatenateexistingwords.Thatmeanswritingonewordafteranother.Forexample,ifhehaswords cat and dog,hewouldgetaword catdog,thatcouldmeansomething......
  • 洛谷 P2730 魔板 题解 DFS(广度优先搜索)
    题目背景在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板。这是一张有 8 个大小相同的格子的魔板:12348765题目描述我们知道魔板的每一个方格都有一种颜色。这 8 种颜色用前 8 个正整数来表示。可以用颜色的序列来表示一种魔板状态,规定从魔板的左......
  • 洛谷题单指南-二叉树-P4715 【深基16.例1】淘汰赛
    原题链接:https://www.luogu.com.cn/problem/P4715题意解读:计算亚军得主,注意能力值最高的肯定是冠军,但能力值第二高的不一定是亚军,因为有可能中途就遭遇冠军。解题思路:根据题意,两两比赛,一轮后再按顺序两两比赛,形如一棵二叉树,但解题其实用不到二叉树的数据结构可以看出,最后参与......
  • 每日一题 第一期 洛谷 铺地毯
    [NOIP2011提高组]铺地毯https://www.luogu.com.cn/problem/P1003题目描述为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有n......
  • 「杂题乱刷」洛谷 P2572
    先上AC代码:点击查看代码/*Tips:你数组开小了吗?你MLE了吗?你觉得是贪心,是不是该想想dp?一个小时没调出来,是不是该考虑换题?*/#include<bits/stdc++.h>usingnamespacestd;#definemapunordered_map#defineforl(i,a,b)for(registerlonglongi=a;i<=b;i++)#define......
  • 洛谷题单指南-线性表-P2234 [HNOI2002] 营业额统计
    原题链接:https://www.luogu.com.cn/problem/P2234题意解读:要计算每一天最小波动值的和,需要对每一天求最小波动值,再求和,如果暴力法,时间复杂度在1+2+3+......+32767≈5*10^8,可能会超时。解题思路:1、暴力法:由于本题测试数据比较水,实测暴力求解直接可以AC,由于没有技术含量,不做具体......
  • Day7代码随想录(1刷) 哈希表
    目录454.四数相加II 383.赎金信15.三数之和 18.四数之和 454.四数相加II给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i,j,k,l) 能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l......
  • 「杂题乱刷」洛谷 P1708
    题目链接P1708解题思路解法一:考虑预处理,这部分可以直接打表。其他题解这部分讲的比较详细了,在此不再赘述。期望得分\(100\)分。解法二:考虑数位dp。这里采用记搜的写法。dfs(last,sum,maxsum,_1)分别表示还需要枚举几位数,目前枚举的数位和,可以枚举的最大数位和,是否均......