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
posted @ 2017-02-08 15:01  安月冷  阅读(177)  评论(0编辑  收藏  举报