2022/2/8学习报告

学习目录.

1.学习散列(hash)和KMP相关知识。

2.解题。

3.复习。

1.P1102 A-B 数对

题目描述

出题是一件痛苦的事情!

相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!

好吧,题目是这样的:给出一串数以及一个数字 C,要求计算出所有A−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。

输入格式

输入共两行

第一行,两个整数 N, C。

第二行,NN 个整数,作为要求处理的那串数。

输出格式

一行,表示该串数中包含的满足 A - B = C的数对的个数。

输入输出样例

输入 #1复制

4 1
1 1 2 3

输出 #1复制

3
#include<stdio.h>
long long int a[1000000],sum;
struct node
{
	long long int wei,ci;//这个位置对应的数,这个数出现了几次
}h[1000000];

long long int hash(long long int x)//存入散列表的函数 
{
	long long int key;
	key=x%1000001;
	return key;
}

long long int find(long long int x)//找到x的位置
{
	int y;
	y=hash(x);
	while(h[y].wei&&h[y].wei!=x)//冲突时,用开放定址法 
	{
		y++;
		y=hash(y);
	}
	return y;
}

int main()
{
	long long int n,c;
	scanf("%lld%lld",&n,&c);
	for(long long int i=1;i<=n;i++)//将数据存入散列表
	{
		scanf("%lld",&a[i]);
		h[find(a[i])].wei=a[i];
		h[find(a[i])].ci++;
	}
	for(long long int i=1;i<=n;i++)
	{
		sum=sum+h[find(a[i]-c)].ci;//统计个数在散列表中出现的次数
	}
	printf("%lld",sum);//输出
	return 0;
}

题解:题目要求求出A-B=C,可以转换为B=A-C(因为C的值时是恒定不变的,不妨一边放置一个变量),之后将所有输入的数存入散列表,出现相同的数就记其出现次数加1,之后一旦出现满足B=A-C(例如输入样例中3=2-1)的情况就在统计结果上记录其出现次数(加到sum里)。

2.P3370 【模板】字符串哈希

这题在处理将字符串转为ascii码时总是不能正确储存结果,计划解答后和明天的题目一起上交

上一篇:多线程——并发编程三大特性


下一篇:【无标题】