4054779_wa.cc

来自「北大大牛代码 1240道题的原代码 超级权威」· CC 代码 · 共 74 行

CC
74
字号
#include <stdio.h>
#include <ext/hash_map>

using namespace std;
using namespace __gnu_cxx;

#define BASE 10000019

struct Range
{
	int *start, *end;
	size_t h;
};

struct Equal
{
	bool operator ()(const Range &a, const Range &b)	const
	{
		return a.h == b.h && equal(a.start, a.end, b.start);
	}
};

struct Hash
{
	size_t operator ()(const Range &a)	const
	{
		return a.h;
	}
};

int main()
{
	int n, k, high;
	bool found;

	scanf("%d%d", &n, &k);
	int data[n];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &data[i]);
	}
	int min, max, mid;
	min = 1; max = n;
	double st = clock();
	while (min < max - 1)
	{
		hash_map <Range, int, Hash, Equal> h;
		high = 1;
		mid = (min + max) >> 1;
		Range range = {data, data + mid, 0};
		found = false;

		for (int i = 0; i < mid; i++)
		{
			range.h = range.h * BASE + data[i];
			high *= BASE;
		}
		for (int i = 0; i + mid < n; i++)
		{
			if (++h[range] >= k)
			{
				found = true;
				break;
			}
			range.h = range.h * BASE + data[i + mid] - high * data[i];
			range.start++;
			range.end++;
		}
		found ? min = mid : max = mid;
	}
	printf("%d\n", min);
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?