hash练习们
610. 数对的个数
★★ 输入文件:dec.in
输出文件:dec.out
简单对比
时间限制:1 s 内存限制:128 MB
Description
出题是一件痛苦的事情!
题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A+B Problem,改用A-B了哈哈!
好吧,题目是这样的:给出一串数以及一个数字C,要求计算出所有A-B=C的数对的个数。
(不同位置的数字一样的数对算不同的数对)
Input Format
第一行包括2个非负整数N和C,中间用空格隔开。
第二行有N个整数,中间用空格隔开,作为要求处理的那串数。
Output Format
输出一行,表示该串数中包含的所有满足A-B=C的数对的个数。
Sample Input
4 1
1 1 2 3
Sample Output
3
Data Limit
对于90%的数据,N <= 2000;
对于100%的数据,N <= 200000。
所有输入数据都在longint范围内。
#include<iostream> #include<cstdio> #include<cstring> #define mod 23333 #define maxn 200010 using namespace std; int a[maxn],n,c,cnt[maxn],head[maxn],num,ans; struct node { int from; int to; int next; }e[maxn<<1]; void insert(int x) { int ha=(x%mod+x/mod)%mod; for(int i=head[ha];i;i=e[i].next) if(e[i].to==x) { cnt[i]++; return; } e[++num].to=x; e[num].next=head[ha]; head[ha]=num;cnt[num]++; } int Query(int x) { int ha=(x%mod+x/mod)%mod; for(int i=head[ha];i;i=e[i].next) if(e[i].to==x) return cnt[i]; return 0; } int main() { freopen("dec.in","r",stdin); freopen("dec.out","w",stdout); scanf("%d%d",&n,&c); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); int s=a[i]+c; insert(s); } for(int i=1;i<=n;i++) ans+=Query(a[i]); printf("%d\n",ans); return 0; }
1176. [郑州101中学] 月考
★ 输入文件:mtest.in
输出文件:mtest.out
简单对比
时间限制:1 s 内存限制:128 MB
【题目描述】
在上次的月考中Bugall同学违反了考场纪律还吃了处分,更可气的是在第二天的校会时
间学校就此事做了全校通报. 现已知在当天校会时间有总共N个同学听到了有关Bugall的处分决定.
Bugall同学在铁一有M个朋友,这M个人中有的可能听到了当天的处分决定,有的可能没
有听到,现在Bugall同学想知道他有几个朋友听到了当天的处分通报.
【输入格式】
第一行为一个整数N,从第2行到N+1行,每行用一个长度不超过200的字符串表示
一个人的名字.
第N+2行为一个整数M,从第N+3行到N+M+2行,每行用一个长度不超过200的字符
串表示Bugall同学一个朋友的名字.
【输出格式】
输出有几个Bugall同学的铁一朋友在当天的校会时间听到了Bugall处分通报.保证不重名。
【样例输入】
3 Dazui Erge Dapigu 2 Varpro Erge
【样例输出】
1
#include<iostream> #include<cstdio> #include<cstring> #define maxn 500010 #define ha 119 #define HA 33 #define mod 233333 #define MOD 100007 using namespace std; int n,m,ans,l,num,cnt[maxn],head[maxn]; char s[205]; struct node{ int to,pre; }e[maxn]; void insert(int x,int y) { for(int i=head[x];i;i=e[i].pre) if(e[i].to==y){ cnt[i]++;return; } num++;e[num].to=y; e[num].pre=head[x]; head[x]=num;cnt[num]++; } int Query(int x,int y) { for(int i=head[x];i;i=e[i].pre) if(e[i].to==y)return cnt[i]; return 0; } int main() { freopen("mtest.in","r",stdin); freopen("mtest.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s",s); l=strlen(s); int t=0,T=0; for(int j=0;j<l;j++) { t=t*ha+s[j]-'A';t%=mod; T=T*HA+s[j]-'A';T%=MOD; } insert(t,T); } scanf("%d",&m); for(int i=1;i<=m;i++) { scanf("%s",s); l=strlen(s); int t=0,T=0; for(int j=0;j<l;j++){ t=t*ha+s[j]-'A';t%=mod; T=T*HA+s[j]-'A';T%=MOD; } ans+=Query(t,T); } printf("%d\n",ans); return 0; }
找不到水题了233333