#include <stdio.h> size_t N; char *buff; int *cmps; // components // char *output; int main(void) { size_t ones=0; scanf("%lu", &N); buff = new char[8*N+1]; scanf("%s", buff); for (size_t i=0; i<8*N; ++i) if (buff[i]=='1') ++ones; // printf("%s\n", buff); // printf("ones: %lu\n", ones); bool possible=true; size_t c_end=0; cmps = new int[N]; size_t c_low; size_t c_high; size_t x, y; size_t n = N; if (ones % 6 == 1) { if (ones < 7) { possible=false; goto finish; } cmps[c_end++] = 3; cmps[c_end++] = 4; ones -= 7; n -= 2; } else if (ones % 6 == 2) { if (ones < 8) { possible=false; goto finish; } cmps[c_end++] = 3; cmps[c_end++] = 5; ones -= 8; n -= 2; } else if (ones % 6 == 3) { cmps[c_end++] = 3; ones -= 3; n -= 1; } else if (ones % 6 == 4) { cmps[c_end++] = 4; ones -= 4; n -= 1; } else if (ones % 6 == 5) { cmps[c_end++] = 5; ones -= 5; n -= 1; } c_low = ones / 6; c_high = ones / 3; if (n > c_high || n < c_low) { possible=false; goto finish; } // x = ones/3 - ones; // y = ones/3 - 2*x; x = c_low; y = 0; while (x + y != n && x != 0) { --x; y += 2; } for (size_t i=0; i<x; ++i) { cmps[c_end++] = 6; // printf("6 "); } for (size_t i=0; i<y; ++i) { cmps[c_end++] = 3; // printf("3 "); } // for (size_t i=0; i<c_end; ++i) { // printf("%i ", cmps[i]); // } // printf("\n"); for (size_t i=0; i<c_end; ++i) { switch (cmps[i]) { // case '1': // break; // case '2': // break; case 3: printf("a"); break; case 4: printf("c"); break; case 5: printf("g"); break; case 6: printf("w"); break; default: break; } } printf("\n"); finish: if (!possible) { printf("NIE\n"); } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | #include <stdio.h> size_t N; char *buff; int *cmps; // components // char *output; int main(void) { size_t ones=0; scanf("%lu", &N); buff = new char[8*N+1]; scanf("%s", buff); for (size_t i=0; i<8*N; ++i) if (buff[i]=='1') ++ones; // printf("%s\n", buff); // printf("ones: %lu\n", ones); bool possible=true; size_t c_end=0; cmps = new int[N]; size_t c_low; size_t c_high; size_t x, y; size_t n = N; if (ones % 6 == 1) { if (ones < 7) { possible=false; goto finish; } cmps[c_end++] = 3; cmps[c_end++] = 4; ones -= 7; n -= 2; } else if (ones % 6 == 2) { if (ones < 8) { possible=false; goto finish; } cmps[c_end++] = 3; cmps[c_end++] = 5; ones -= 8; n -= 2; } else if (ones % 6 == 3) { cmps[c_end++] = 3; ones -= 3; n -= 1; } else if (ones % 6 == 4) { cmps[c_end++] = 4; ones -= 4; n -= 1; } else if (ones % 6 == 5) { cmps[c_end++] = 5; ones -= 5; n -= 1; } c_low = ones / 6; c_high = ones / 3; if (n > c_high || n < c_low) { possible=false; goto finish; } // x = ones/3 - ones; // y = ones/3 - 2*x; x = c_low; y = 0; while (x + y != n && x != 0) { --x; y += 2; } for (size_t i=0; i<x; ++i) { cmps[c_end++] = 6; // printf("6 "); } for (size_t i=0; i<y; ++i) { cmps[c_end++] = 3; // printf("3 "); } // for (size_t i=0; i<c_end; ++i) { // printf("%i ", cmps[i]); // } // printf("\n"); for (size_t i=0; i<c_end; ++i) { switch (cmps[i]) { // case '1': // break; // case '2': // break; case 3: printf("a"); break; case 4: printf("c"); break; case 5: printf("g"); break; case 6: printf("w"); break; default: break; } } printf("\n"); finish: if (!possible) { printf("NIE\n"); } return 0; } |