Submission #1327014

#TimeUsernameProblemLanguageResultExecution timeMemory
1327014skibidigodv9Languages (IOI10_languages)C++20
89 / 100
3488 ms21576 KiB
#include <bits/stdc++.h>
#include "grader.h"
using namespace std;

vector<int> filler(56, 0);
vector<vector<int>> single2D(65536, filler);
unordered_map<long long, int> doubleWeight[56];
long long singleConst = 100000000000, doubleConst = 670000000000;
//single[char][lang] = weight?

void excerpt(int* E) {
    int n = 100, i, j;
    vector<long long> langScore(56, 0);
    //singles
    i = -1; while (++i < n) {
        int v = E[i];
        long long S = 0;
        j = -1; while (++j < 56) {
            long long sv = single2D[v][j];
            S += sv*sv;
        }
        if (S == 0) {
            langScore[0]++;
        } else {
            long long sc = singleConst/S;
            j = -1; while (++j < 56) {
                long long sv = single2D[v][j];
                langScore[j] += sc*sv*sv;
            }
        }
    }

    i = 0; while (++i < n) {
        long long a = E[i-1], b = E[i];
        long long dv = (a<<16LL)+b, S = 0;
        j = -1; while (++j < 56) {
            if (doubleWeight[j].find(dv) != doubleWeight[j].end()) {
                long long ww = doubleWeight[j][dv];
                S += ww*ww;
            } 
        }
        if (S == 0) {
            langScore[0]++;
        } else {
            long long dc = doubleConst/S;
            j = -1; while (++j < 56) {
                if (doubleWeight[j].find(dv) != doubleWeight[j].end()) {
                    long long ww = doubleWeight[j][dv];
                    langScore[j] += dc*ww*ww;
                }
            }
        }
    }

    long long bestLang = 0;
    i = -1; while (++i < 56) {
        if (langScore[i] > langScore[bestLang]) bestLang = i;
    }
    long long L = language(bestLang);
    i = -1; while (++i < n) {
        int v = E[i];
        single2D[v][L]++;
    }

    i = 0; while (++i < n) {
        long long a = E[i-1], b = E[i];
        long long dv = (a<<16LL)+b;
        doubleWeight[L][dv]++;
    }
    return;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...