# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
146341 | popovicirobert | Languages (IOI10_languages) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
using namespace std;
#include "grader.h"
#include "lang.h"
#define SZ 100
const int B = (int) 1e9 + 7;
unordered_map <ull, int> mp[60];
bool ok[60][66000];
bool vis[60];
inline ll myrand() {
return (1LL * rand() << 15) + rand();
}
void excerpt(int *E) {
int i, j;
vector < vector <int> > arr(56, vector <int>(5));
int id = -1;
for(int len = 4; len >= 1; len--) {
ull cur = 0, pw = 1;
for(i = 1; i < len; i++) {
pw *= B;
}
for(i = 0; i + len <= 100; i++) {
cur = cur * B + E[i];
if(i >= len - 1) {
for(int j = 0; j < 56; j++) {
arr[j][len] += mp[j][cur];
}
cur -= pw * E[i - len + 1];
}
}
}
/*vector <int> ord(56);
iota(ord.begin(), ord.end(), 0);
sort(ord.begin(), ord.end(), [&](const int &x, const int &y) {
for(int i = 4; i >= 0; i--) {
if(arr[x][i] < arr[y][i]) {
return 1;
}
if(arr[x][i] > arr[y][i]) {
return 0;
}
}
return 1;
});*/
id = ord[55];
if(*max_element(arr[id].begin(), arr[id].end()) == 0) {
id = -1;
}
if(id == -1) {
unordered_map <int, int> aux;
for(i = 0; i < 100; i++) {
aux[E[i]] = 1;
}
int mx = 0;
for(i = 0; i < 56; i++) {
int cur = 0;
for(auto it : aux) {
cur += ok[i][it.first];
}
if(cur > mx) {
mx = cur, id = i;
}
}
if(id == -1) {
vector <int> ids;
for(i = 0; i < 56; i++) {
if(vis[i] == 0) ids.push_back(i);
}
int sz = ids.size();
id = ids[myrand() % sz];
}
}
id = language(id);
for(i = 0; i < 100; i++) {
ull cur = 0;
for(j = i; j < i + 4 && j < 100; j++) {
cur = cur * B + E[j];
mp[id][cur]++;
}
ok[id][E[i]] = 1;
}
vis[id] = 1;
}