Submission #1340001

#TimeUsernameProblemLanguageResultExecution timeMemory
1340001k1r1t0Languages (IOI10_languages)C++20
93 / 100
3294 ms900 KiB
#include <bits/stdc++.h>

using namespace std;
using ld = long double;
#define right giorgme

int language(int x);

namespace k1r1t0 {

const int L = 100;
const int K = 56;
const int V = 65535;
const int B = 512;

int mp1[K][B], mp2[K][B], cc1[B], cc2[B], vv[B];
int go[V];
bool was = false;

ld dist(int a[], int b[]) {
    int sa = 0, sb = 0;
    for (int i = 0; i < B; i++) {
        sa += a[i];
        sb += b[i];
    }
    ld dist = 0;
    for (int x = 0; x < B; x++) {
        ld p1 = 1.0l * a[x] / sa;
        ld p2 = 1.0l * b[x] / sb;
        ld diff = abs(p1 - p2);
        dist += diff;
    }
    return dist;
}

ld sim(int a[], int b[]) {
    ld dist = 0;
    for (int i = 0; i < B; i++)
        if (a[i] > 0 && b[i] > 0)
            dist--;
    return dist / B;
}

void init() {
    if (was) return;
    for (int i = 0; i < V; i++)
        go[i] = rand() % B;
    was = true;
}

void excerpt(int e[]) {
    init();
    for (int i = 0; i < L; i++)
        e[i] = go[e[i] - 1];
    for (int i = 0; i < B; i++)
        cc1[i] = cc2[i] = 0;
    for (int i = 0; i < L; i++)
        cc1[e[i]]++;
    for (int i = 0; i + 1 < L; i++)
        cc2[(e[i] + (e[i + 1] ^ 47)) % B]++;
    pair<ld, int> opt = {1e18, 0};
    for (int i = 0; i < K; i++) {
        ld cur = 0;
        cur += 1.0l * dist(cc1, mp1[i]);
        cur += 2.2l * dist(cc2, mp2[i]);
        cur += 50.0l * sim(cc1, mp1[i]);
        cur += 10.0l * sim(cc2, mp2[i]);
        opt = min(opt, {cur, i});
    }
    int f = language(opt.second);
    for (int i = 0; i < B; i++) {
        mp1[f][i] += cc1[i];
        mp2[f][i] += cc2[i];
    }
}

}

void excerpt(int e[]) {
    k1r1t0::excerpt(e);
}








#ifdef LOCAL
#define N 100

static char lang[20], lan[100][20];
static int lnum, i, n, nl, uni[N], right, tot;
static int called = 0;
int language(int L) {
  if (called) {
    printf("Duplicate language call\n");
    exit(0);
  }
  if (L < 0 || L >= 56) {
    printf("Invalid language code: %d\n", L);
    exit(0);
  }
  called = 1;
  right += (L == lnum);
  tot++;
  return lnum;
}

int main() {
    freopen("input (2).txt", "r", stdin);
  for (n = 0; 1 == scanf("%s", lang); n++) {
      if (n % 1000 == 0)
        cout << n << endl;
    if (!strcmp(lang, "??"))
      break;
    for (i = 0; i < nl && strcmp(lang, lan[i]); i++) {
    }
    strcpy(lan[i], lang);
    if (i == nl) {
      nl++;
    }
    lnum = i;
    for (i = 0; i < N; i++)
      scanf("%d,", &uni[i]);
    scanf("%*[^\n]");
    called = 0;
    excerpt(uni);
    if (!called) {
      printf("NO language call\n");
      exit(0);
    }
  }
  printf("OK\n%0.2lf\n", 110.0 * right / tot);
  return 0;
}
#endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...