Ranking (as of 2015-08-26): 11 out of 503
Language: C++
/*
UVa 11536 - Smallest Sub-Array
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_11536_Smallest_Sub_Array.cpp
*/
#include <algorithm>
#include <cstdio>
using namespace std;
const int N_max = 1000000, K_max = 100;
int seq[N_max + 1], freqs[K_max + 1]; // freqs[i] is the number of occurences of i
int main()
{
int T;
scanf("%d", &T);
for (int t = 1; t <= T; t++) {
int N, M, K;
scanf("%d %d %d", &N, &M, &K);
if (K < 4) {
printf("Case %d: %d\n", t, K);
continue;
}
for (int i = 1; i <= K; i++)
freqs[i] = 0;
seq[1] = 1, seq[2] = 2, seq[3] = 3;
freqs[1] = freqs[2] = freqs[3] = 1;
int k = 3, min_length = N + 1;
for (int i = 4, pi = 1; i <= N; i++) {
int s = (seq[i - 1] + seq[i - 2] + seq[i - 3]) % M + 1;
seq[i] = s;
if (s <= K) {
if (!freqs[s]++) {
if (++k == K)
min_length = min(min_length, i - pi + 1);
}
else {
for ( ; pi < i; pi++) {
int p = seq[pi];
if (p > K)
continue;
if (freqs[p] < 2)
break;
freqs[p]--;
}
if (k == K)
min_length = min(min_length, i - pi + 1);
}
}
}
printf("Case %d: ", t);
if (min_length > N)
puts("sequence nai");
else
printf("%d\n", min_length);
}
return 0;
}