#include "grader.h"
#include <bits/stdc++.h>
using namespace std;
static constexpr int K = 56;
static map<uint32_t,int> g1[K];
static map<uint64_t,int> g2[K];
static map<uint64_t,int> g3[K];
static map<uint64_t,int> g4[K];
static int examples_seen[K];
static inline uint64_t enc2(uint32_t a, uint32_t b) {
return ((uint64_t)a << 16) | b;
}
static inline uint64_t enc3(uint32_t a, uint32_t b, uint32_t c) {
return ((uint64_t)a << 32) | ((uint64_t)b << 16) | c;
}
static inline uint64_t enc4(uint32_t a, uint32_t b, uint32_t c, uint32_t d) {
return ((uint64_t)a << 48) |
((uint64_t)b << 32) |
((uint64_t)c << 16) |
d;
}
void excerpt(int E[100]) {
set<uint32_t> s1;
set<uint64_t> s2, s3, s4;
for(int i = 0; i < 100; i++) {
s1.insert(E[i]);
if(i >= 1) s2.insert(enc2(E[i-1], E[i]));
if(i >= 2) s3.insert(enc3(E[i-2], E[i-1], E[i]));
if(i >= 3) s4.insert(enc4(E[i-3], E[i-2], E[i-1], E[i]));
}
int best_lang = 0;
double best_score = -1e100;
for(int L = 0; L < K; L++) {
if(examples_seen[L] == 0) continue;
double score = 0;
for(auto x : s1) {
auto it = g1[L].find(x);
if(it != g1[L].end())
score += 9.0 * log(1.0 + it->second);
}
for(auto x : s2) {
auto it = g2[L].find(x);
if(it != g2[L].end())
score += 5.0 * log(1.0 + it->second);
}
for(auto x : s3) {
auto it = g3[L].find(x);
if(it != g3[L].end())
score += 1.0 * log(1.0 + it->second);
}
for(auto x : s4) {
auto it = g4[L].find(x);
if(it != g4[L].end())
score += 7.0 * log(1.0 + it->second);
}
if(score > best_score) {
best_score = score;
best_lang = L;
}
}
int correct = language(best_lang);
examples_seen[correct]++;
for(auto x : s1) g1[correct][x]++;
for(auto x : s2) g2[correct][x]++;
for(auto x : s3) g3[correct][x]++;
for(auto x : s4) g4[correct][x]++;
}