HDU 2549 Sumset Hash+枚举

经典的3-sum问题,写了个hash400ms过,但是写的n^3的暴力枚举特么居然0ms,让我非常不能容忍。

Hash代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>

using namespace std;
const int maxn = 1005;
const int mod = 1000007;
typedef long long LL;

int head[mod], nxt[mod * 10], sz;
LL A[mod * 10], B[mod * 10];
LL val[mod * 10];
int n, S[maxn];

void clear() {
	memset(head, -1, sizeof(head));
	sz = 0;
}

LL mabs(LL x) {
	return x < 0 ? -x : x;
}

int get_hash(LL x) {
	return mabs(x) % mod;
}

void insert(LL x, LL a, LL b) {
	int pos = get_hash(x);
	A[sz] = a; B[sz] = b; nxt[sz] = head[pos];
	val[sz] = x; head[pos] = sz++;
}

bool check(LL x, LL a, LL b) {
	int pos = get_hash(x);
	for (int i = head[pos]; ~i; i = nxt[i]) {
		if (val[i] == x && A[i] != a && A[i] != b &&
			B[i] != a && B[i] != b) {
			return true;
		}
	}
	return false;
}

int main() {
	while (scanf("%d", &n), n) {
		clear();
		for (int i = 0; i < n; i++) {
			scanf("%d", &S[i]);
		}
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) if(S[i] != S[j]) {
				insert(S[i] + S[j], S[i], S[j]);
			}
		}

		LL ans = -1e17; bool ok = false;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) if (S[i] != S[j]) {
				if (check(S[i] - S[j], S[i], S[j])) {
					ans = max(ans,(LL)S[i]); ok = true;
				}
			}
		}

		if (ok) cout << ans << endl;
		else cout << "no solution" << endl;
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/rolight/p/3941636.html