学习目录.
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码时总是不能正确储存结果,计划解答后和明天的题目一起上交