白皮书尺取法例题,基本和之前一道题目思路相同。刚开始为了图省事,为中间枚举的数组也开了一个set,但是后来发现会wa,换成hash(map)之后就很好过了。
#include <iostream>
#include <cstdio>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
int a[1000010], p;
int main()
{
scanf("%d", &p);
set<int> total, cur;
map<int, int> cnt;
for (int i = 0; i < p; i++)
{
scanf("%d", &a[i]);
total.insert(a[i]);
}
int size = total.size();
int s = 0, t = 0, res = p, sum = 0;
for(;;)
{
while (t < p && sum < size)
{
if (cnt[a[t++]]++ == 0)
sum++;
}
if (sum < size)
break;
res = min(res, t - s);
if (--cnt[a[s++]] == 0)
{
sum--;
}
}
printf("%d\n", res);
}