2月9日练习题

P3370 【模板】字符串哈希

题目描述

在这里插入图片描述

输入格式

在这里插入图片描述

输出格式

在这里插入图片描述

输入 #1

5
abc
aaaa
abc
abcc
12345

输出 #1

4

代码

#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
#define mod 1000000007;
char s[10010][2000];
int n,h[10010],p=13331;
int main()
{
	cin>>n;
	int i,j,w;
	long long int ans=1;
	for(i=0;i<n;i++)
	{
		cin>>s[i];
		int l=strlen(s[i]);
		for(j=0;j<l;j++)
		{
			h[i]+=s[i][j]*p;
			h[i]=(h[i]*10)%mod;
		}
	}
	sort(h,h+n);
	//for(i=0;i<n;i++)
		//cout<<h[i]<<' ';
	for(i=1;i<n;i++)
		if(h[i]!=h[i-1])
			ans++;
	cout<<ans;
}

总结

字符串哈希,可以将一串字符转化为整数,再通过整数来判断这一串字符有没有出现过,一般乘以素数,如:131,13331,2333等,或最大值,然后再对素数1e9+7取模。

P1102 A-B 数对

题目描述

在这里插入图片描述

输入格式

在这里插入图片描述

输出格式

在这里插入图片描述

输入 #1

4 1
1 1 2 3

输出 #1

3

代码

#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<cstdio>
using namespace std;
map<int, int >m;
int n, c, i,a[200010];
int main()
{
	cin >> n >> c;
	for (i = 0; i < n; i++)
	{
		cin >> a[i];
		m[a[i]]++;
		a[i] = a[i] - c;//map就是一个映射,里面的元素是唯一的,所以我们标记完后就做差,再用差去找个数就行了
	}
	long long int ans = 0;
	for (i = 0; i<n; i++)
	{
		if (m[a[i]] > 0)
			ans+=m[a[i]];//比如说a[i]=2,找1的个数,两个,总值加二
	}
	cout << ans;
}

总结

建立一个map的映射,由数字到数字的出现次数,然后输入数组。因为题目要求A-B=C的对数,我们可以转化为A-C=B,这样我们每输入一个数,建立映射之后就将它做差,再将做差之后的数组去找出现的次数,就可以得到答案了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值