Submission #980786

#TimeUsernameProblemLanguageResultExecution timeMemory
980786SirLemonMeringueAlice, Bob, and Circuit (APIO23_abc)C++17
32 / 100
113 ms12072 KiB
#include "abc.h" #include <bits/stdc++.h> using namespace std; // you may find the definitions useful const int OP_ZERO = 0; // f(OP_ZERO, x0, x1) = 0 const int OP_NOR = 1; // f(OP_NOR, x0, x1) = !(x0 || x1) const int OP_GREATER = 2; // f(OP_GREATER, x0, x1) = (x0 > x1) const int OP_NOT_X1 = 3; // f(OP_NOT_X1, x0, x1) = !x1 const int OP_LESS = 4; // f(OP_LESS, x0, x1) = (x0 < x1) const int OP_NOT_X0 = 5; // f(OP_NOT_X0, x0, x1) = !x0 const int OP_XOR = 6; // f(OP_XOR, x0, x1) = (x0 ^ x1) const int OP_NAND = 7; // f(OP_NAND, x0, x1) = !(x0 && x1) const int OP_AND = 8; // f(OP_AND, x0, x1) = (x0 && x1) const int OP_EQUAL = 9; // f(OP_EQUAL, x0, x1) = (x0 == x1) const int OP_X0 = 10; // f(OP_X0, x0, x1) = x0 const int OP_GEQ = 11; // f(OP_GEQ, x0, x1) = (x0 >= x1) const int OP_X1 = 12; // f(OP_X1, x0, x1) = x1 const int OP_LEQ = 13; // f(OP_LEQ, x0, x1) = (x0 <= x1) const int OP_OR = 14; // f(OP_OR, x0, x1) = (x0 || x1) const int OP_ONE = 15; // f(OP_ONE, x0, x1) = 1 // Alice int // returns la alice( /* in */ const int n, /* in */ const char names[][5], /* in */ const unsigned short numbers[], /* out */ bool outputs_alice[] ) { if (n==1){ for(int i=0;i<16;i++){ outputs_alice[i] = numbers[0] & (1<<i); } return 16; } else if (n==26){ //output numbers[0] for(int j=0;j<26;j++){ for(int i=0;i<16;i++){ outputs_alice[16*j+i] = numbers[j] & (1<<i); } } return 16*26; } } // Bob int // returns lb bob( /* in */ const int m, /* in */ const char senders[][5], /* in */ const char recipients[][5], /* out */ bool outputs_bob[] ) { /* outputs_bob[0] = 1; outputs_bob[1] = 1; outputs_bob[2] = 0; */ //output m if (m<=1 || (senders[0]==senders[1] && recipients[0]==recipients[1])){ for(int i=0;i<10;i++){ outputs_bob[i] = m & (1<<i); } return 10; } else { for(int i=0;i<26;i++){ for(int j=0;j<26;j++){ outputs_bob[26*i+j] = 0; } } //for all edges, mark at the receiving end for(int e=0;e<m;e++){ int s = senders[e][0]-'a'; int r = recipients[e][0]-'a'; outputs_bob[26*r+s] = 1; } return 26*26; } } struct gate { int p; int x0,x1; }; vector<gate> bitShiftBlock(int pos, int shift, int left, int size, int determinant){ //if determinant output = 0, block=0 vector<gate> block; //the first shift are all 0 for(int i=0;i<shift;i++){ block.push_back({0,0,1}); } //the remaining work from the left for(int i=0;i<size-shift;i++){ block.push_back({8,left+i,determinant}); } return block; } //sum block // {block of length size starting at left}{block of length size starting at left2}{stuff.....sum of two blocks} vector<gate> sumBlock(int pos, int left, int left2, int size){ vector<gate> block; vector<gate> endBlock; //first gate is sum0: xor int at = pos; block.push_back({6,left,left2}); endBlock.push_back({10,at,0}); at++; //next gate is carry0: and block.push_back({8,left,left2}); at++; //create remaining using full adders for(int i=1;i<size;i++){ //D is xor of things block.push_back({6,left+i,left2+i}); at++; // D is at-1, Cin is at-2 //E is D AND Cin block.push_back({8,at-1,at-2}); at++; //E is at-1, D is at-2, Cin is at-3 //F is A AND B block.push_back({8,left+i,left2+i}); at++; //F is at-1, E is at-2, D is at-3, Cin is at-4 //S is D XOR Cin block.push_back({6,at-3,at-4}); endBlock.push_back({10,at,0}); at++; //F is at-2, E is at-3, D is at-4, Cin is at-5 //Cout is F XOR E block.push_back({6,at-2,at-3}); at++; } //add endBlock to block for(auto a : endBlock){ block.push_back(a); } return block; } // Circuit int // returns l circuit( /* in */ const int la, /* in */ const int lb, /* out */ int operations[], /* out */ int operands[][2], /* out */ int outputs_circuit[][16] ) { //first bits are input int L = la+lb; if (la==16){ //start by adding null block of zeros for(int i=0;i<16;i++){ operations[L] = 0; operands[L][0] = 0; operands[L][1] = 0; L++; } //do all things for(int i=0;i<10;i++){ //add the bitshift block at L vector<gate> block = bitShiftBlock(L,i,0,16,16+i); for(auto a : block){ operations[L] = a.p; operands[L][0] = a.x0; operands[L][1] = a.x1; L++; } //add the sum block at L vector<gate> block2 = sumBlock(L,L-32,L-16,16); for(auto a : block2){ operations[L] = a.p; operands[L][0] = a.x0; operands[L][1] = a.x1; L++; } } //answer is just last 16 bits for(int j=0;j<16;j++){ outputs_circuit[0][j] = L-16+j; } } else { //solve person by person for(int p=0;p<26;p++){ //add null block of zeros for(int i=0;i<16;i++){ operations[L] = 0; operands[L][0] = 0; operands[L][1] = 0; L++; } //then, for every other person, copy over their number if they sent a thing to p (0 otherwise), and add to running total for(int q=0;q<26;q++){ //add the bitshift block at L vector<gate> block = bitShiftBlock(L,0,16*q,16,la+26*p+q); for(auto a : block){ operations[L] = a.p; operands[L][0] = a.x0; operands[L][1] = a.x1; L++; } //keep running total //add the sum block at L vector<gate> block2 = sumBlock(L,L-32,L-16,16); for(auto a : block2){ operations[L] = a.p; operands[L][0] = a.x0; operands[L][1] = a.x1; L++; } } //result for this person is last 16 bits for(int j=0;j<16;j++){ outputs_circuit[p][j] = L-16+j; } } } /* //start by adding null block of zeros for(int i=0;i<16;i++){ operations[L] = 0; operands[L][0] = 0; operands[L][1] = 0; L++; } //do all things for(int i=0;i<10;i++){ //add the bitshift block at L vector<gate> block = bitShiftBlock(L,i,0,16,16+i); for(auto a : block){ operations[L] = a.p; operands[L][0] = a.x0; operands[L][1] = a.x1; L++; } //add the sum block at L vector<gate> block2 = sumBlock(L,L-32,L-16,16); for(auto a : block2){ operations[L] = a.p; operands[L][0] = a.x0; operands[L][1] = a.x1; L++; } } //answer is just last 16 bits for(int j=0;j<16;j++){ outputs_circuit[0][j] = L-16+j; } */ //printf("%d\n",L); return 80000; /* operations[5] = 8; operations[6] = 14; operands[5][0] = 0; operands[5][1] = 4; operands[6][0] = 2; operands[6][1] = 5; int final_results[] = {20000, 0, 24464}; for(int i = 0; i < 3; ++i) for(int j = 0; j < 16; ++j) outputs_circuit[i][j] = 5 + (final_results[i] >> j & 1); return 7; */ }

Compilation message (stderr)

abc.cpp: In function 'int alice(int, const char (*)[5], const short unsigned int*, bool*)':
abc.cpp:48:1: warning: control reaches end of non-void function [-Wreturn-type]
   48 | }
      | ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...