#include "grader.h"
#include <iostream>
#include <unordered_map>
using namespace std;
using ll = long long;
struct limbi { ///da, cu hash-uri (ish)
unordered_map <int, int> unu, doi, trei;
int cate = 0;
}cnt[57];
int baza = 65537, MOD = 100076969;
int convert2(int a, int b) {
ll nr = (1LL * a * baza + b) % MOD;
return nr;
}
int convert3(int a, int b, int c) {
ll nr = (((1LL * a * baza * baza) % MOD) + ((1LL * b * baza) % MOD) + c) % MOD;
return nr;
}
double limba[57];
void excerpt(int *e) {
limbi a;
for(int i = 0; i < 100; i++) ///init
a.unu[e[i]] = 1;
for(int i = 1; i < 100; i++) {
int nr = convert2(e[i - 1], e[i]);
a.doi[nr] = 1;
}
for(int i = 2; i < 100; i++) {
int nr = convert3(e[i - 2], e[i - 1], e[i]);
a.trei[nr] = 1;
}
for(int i = 0; i <= 55; i++) ///reset
limba[i] = 0;
double maxx = -1, ans = 0;
for(int i = 0; i <= 55; i++) {
for(auto x : a.unu) {
if(cnt[i].unu.find(x.first) != cnt[i].unu.end())
limba[i] += ((double)cnt[i].unu[x.first] / (double)cnt[i].cate);
}
for(auto x : a.doi) {
if(cnt[i].doi.find(x.first) != cnt[i].doi.end())
limba[i] += ((double)cnt[i].doi[x.first] / (double)cnt[i].cate);
}
for(auto x : a.trei) {
if(cnt[i].trei.find(x.first) != cnt[i].trei.end())
limba[i] += ((double)cnt[i].trei[x.first] / (double)cnt[i].cate);
}
if(limba[i] > maxx) {
maxx = limba[i];
ans = i;
}
}
int check = language(ans);
cnt[check].cate++;
if(a.unu.size() > cnt[check].unu.size())
swap(a.unu, cnt[check].unu);
if(a.doi.size() > cnt[check].doi.size())
swap(a.doi, cnt[check].doi);
if(a.trei.size() > cnt[check].trei.size())
swap(a.trei, cnt[check].trei);
for(auto x : a.unu)
cnt[check].unu[x.first] += x.second;
for(auto x : a.doi)
cnt[check].doi[x.first] += x.second;
for(auto x : a.trei)
cnt[check].trei[x.first] += x.second;
}