#include <bits/stdc++.h>
#include "grader.h"
#include "encoder.h"
using namespace std;
const int MAXN = 1e3 + 10;
static int pai[MAXN];
static int dist[MAXN][MAXN], marc[MAXN][MAXN];
static vector<int> adj[MAXN];
map<string, int> ord;
void calc_ord(int pos, int &i, string &cur){
  if(pos == 5){
    ord[cur] = i++;
    return;
  }
  cur.push_back('0');
  cur.push_back('0');
  calc_ord(pos + 1, i, cur);
  cur[cur.size() - 1] = '1';
  calc_ord(pos + 1, i, cur);
  cur[cur.size() - 1] = '0';
  cur[cur.size() - 2] = '1';
  calc_ord(pos + 1, i, cur);
  cur.pop_back();
  cur.pop_back();
} 
void send_pai(int n){
  for(int i=1; i<n; i++){
    for(int j=0; j<10; j++){
      if(pai[i] & (1 << j)){
        encode_bit(1); 
      } else encode_bit(0);
    }
  }
}
void send_hub(int n, int h){
  string ans;
  for(int i=1; i<n; i++){
    if(dist[h][i] < dist[h][pai[i]]){
      ans.push_back('0');
      ans.push_back('1');
    } else if(dist[h][i] == dist[h][pai[i]]){
      ans.push_back('0');
      ans.push_back('0');
    } else{
      ans.push_back('1');
      ans.push_back('0');
    }
  }
  if((n - 1) % 5 != 0){ 
    for(int i=0; i<(5 - (n - 1) % 5); i++){
      ans.push_back('0');
      ans.push_back('0');
    }
  }
  for(int i=0; i<ans.size(); i+=10){
    string cur;
    for(int j=i; j<(i + 10); j++) cur.push_back(ans[j]);
    for(int j=0; j<8; j++){
      if(ord[cur] & (1 << j)){
        encode_bit(1);
      } else encode_bit(0);
    }
  }
}
void bfs(int h){
  queue<int> q;
  q.push(h);
  dist[h][h] = 0;
  marc[h][h] = 1;
  pai[0] = 0;
  while(!q.empty()){
    int v = q.front();
    q.pop();
    for(auto u : adj[v]){
      if(!marc[h][u]){
        dist[h][u] = dist[h][v] + 1;
        marc[h][u] = 1;
        if(h == 0) pai[u] = v;
        q.push(u);
      }
    }
  }
}
void encode(int n, int h, int p, int *a, int *b){
  int i = 0;
  string cur = "";
  calc_ord(0, i, cur);
  for(int i=0; i<n; i++) adj[i].clear();
  for(int i=0; i<h; i++){
    for(int j=0; j<n; j++){
      marc[i][j] = 0;
    }
  }
  for(int i=0; i<p; i++){
    adj[a[i]].push_back(b[i]);
    adj[b[i]].push_back(a[i]);
  }
  for(int i=0; i<h; i++) bfs(i);
  for(int i=1; i<h; i++){
    for(int j=0; j<10; j++){
      if(dist[i][0] & (1 << j)){
        encode_bit(1);
      } else encode_bit(0);
    }
  }
  send_pai(n);
  for(int i=1; i<h; i++) send_hub(n, i);
}
#include <bits/stdc++.h>
#include "grader.h"
#include "decoder.h"
using namespace std;
const int MAXN = 1e3 + 10;
static int pai[MAXN];
static int dist[MAXN][MAXN], marc[MAXN][MAXN];
int dif[MAXN];
static vector<int> adj[MAXN];
map<int, string> str;
void calc_str(int pos, int &i, string &cur){
  if(pos == 5){
    str[i++] = cur;
    return;
  }
  cur.push_back('0');
  cur.push_back('0');
  calc_str(pos + 1, i, cur);
  cur[cur.size() - 1] = '1';
  calc_str(pos + 1, i, cur);
  cur[cur.size() - 1] = '0';
  cur[cur.size() - 2] = '1';
  calc_str(pos + 1, i, cur);
  cur.pop_back();
  cur.pop_back();
} 
void find_pai(int n){
  for(int i=1; i<n; i++){
    pai[i] = 0;
    for(int j=0; j<10; j++){
      pai[i] += decode_bit() * (1 << j);
    }
  }
}
void find_hub(int n, int h){
  for(int i=1; i<n; i+=5){
    int x = 0;
    for(int j=0; j<8; j++) x += decode_bit() * (1 << j);
    int j = 0, id = i;
    while(id < min(n, i + 5)){
      if(str[x][j] == '0'){
        if(str[x][j + 1] == '0'){
          dif[id] = 0;
        } else dif[id] = -1;
      } else dif[id] = 1;
      j += 2;
      id ++;
    }
  }
  queue<int> q;
  q.push(0);
  marc[h][0] = 1;
  while(!q.empty()){
    int v = q.front();
    q.pop();
    for(auto u : adj[v]){
      if(!marc[h][u]){
        marc[h][u] = 1;
        dist[h][u] = dist[h][v] + dif[u];
        q.push(u);
      }
    }
  }  
}
void decode(int n, int h){
  int i = 0;
  string cur = "";
  calc_str(0, i, cur);
  for(int i=1; i<h; i++){
    for(int j=0; j<10; j++){
      dist[i][0] += decode_bit() * (1 << j);
    }
  }
  find_pai(n);
  for(int i=0; i<h; i++){
    for(int j=0; j<n; j++){
      marc[i][j] = 0;
    }
  }
  for(int i=0; i<n; i++) adj[i].clear();
  for(int i=1; i<n; i++){
    adj[pai[i]].push_back(i);
    adj[i].push_back(pai[i]);
  }
  queue<int> q;
  for(int i=0; i<n; i++) dif[i] = 1;
  q.push(0);
  
  marc[0][0] = 1;
  dist[0][0] = 0;
  while(!q.empty()){
    int v = q.front();
    q.pop();
    for(auto u : adj[v]){
      if(!marc[0][u]){
        marc[0][u] = 1;
        dist[0][u] = dist[0][v] + dif[u];
        q.push(u);
      }
    }
  }
  for(int i=1; i<h; i++) find_hub(n, i);
  for(int i=0; i<h; i++){
    for(int j=0; j<n; j++){
      hops(i, j, dist[i][j]);
    }
  }
} 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |