其他分享
首页 > 其他分享> > #217-[哈希]好人卡

#217-[哈希]好人卡

作者:互联网

Description

L一直认为,在他的收集来的众多卡片中,如果存在Am + An + Ap = Ai(1 <= m n p < i)(m n p可以相同)的话,卡片号码为Ai的卡片就是一张好人卡。现在,L有一堆卡片,他想知道这里面中有多少张好人卡,请你帮帮他。

 

Input

第一行只有一个正整数N,意义如上。
第二行包含N个整数,表示An。

 

Output

输出一个整数,表示这个数列中好人卡的张数。

Input 1
2
1  3

Input 2
6
1  2  3  5  7  10


Input 3
3
-1  2  0
Output 1
1
	
Output 2
4	

Output3
1

HINT

对于10%的数据  1<=N<=10
对于40%的数据  1<=N<=500    -10^5<=Ai<=10^5
对于70%的数据  1<=N<=5000    -10^6<=Ai<=10^6
对于100%的数据 1<=N<=5000   -10^9<=Ai<=10^9

 

Source/Category

Hash 

即a[m]+a[n]=a[p]−a[i],直接哈希查找。

对了STL慢的一批要手写

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int MAXN = 5010, MAXM = MAXN*MAXN/2, mod = 20180905;

int a[MAXN], key[MAXM], nxt[MAXM], head[mod+6], cnt=0;

void insert(int x) { // 插入哈希
    int id = x&mod;
    key[++cnt]=x; nxt[cnt]=head[id]; head[id]=cnt;
}
bool count(int x) { // 查找
    for (int i=head[x&mod]; i; i=nxt[i]) {
        if (key[i]==x) return true;
    }
    return false;
}
int main() {
    int n, res=0; scanf("%d", &n);
    for (int i=1; i<=n; ++i) {
        scanf("%d", a+i);
        for (int j=1; j<i; ++j) {
            if (count(a[i]-a[j])) { // 找到了,退出
                ++res; break;
            }
        }
        for (int j=1; j<=i; ++j) insert(a[i]+a[j]); // 把和加入哈希
    }
    printf("%d", res);
    return 0;
}

 

标签:217,cnt,int,head,好人,哈希,Output,Input,mod
来源: https://blog.csdn.net/drtlstf/article/details/89575320