nasarouf

IPSC2017_K

Jul 8th, 2017
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.37 KB | None | 0 0
  1. #include <iostream>
  2. #include <cassert>
  3. using namespace std;
  4.  
  5. #define SZ 28
  6. char s[1000001],bits[4000001];
  7. int p[1 << SZ];
  8.  
  9. void proc(){
  10.     cin >> s;
  11.     int t = 0;
  12.     for (int i = 0; s[i]; i++) {
  13.         int x = ((int)s[i] - 33);
  14.         int d = x % 3; x /= 3;
  15.         int c = x % 3; x /= 3;
  16.         int b = x % 3; x /= 3;
  17.         int a = x % 3; x /= 3;
  18.         bits[t++] = a;
  19.         bits[t++] = b;
  20.         bits[t++] = c;
  21.         bits[t++] = d;
  22.         //      cout << a << b << c << d;
  23.     }
  24.     int last = -1, pat=0;
  25.     for (int i = 0; i<t; i++) {
  26.         if (bits[i] == 2) {
  27.             last = i; pat = 0;
  28.         }
  29.         else {
  30.             //counting if 0 or 1 is more likely given `pat`
  31.             if (i > last + SZ) {
  32.                 if (bits[i]) {
  33.                     if (p[pat] == -1) p[pat] = 1;
  34.                     else p[pat]++;
  35.                 }
  36.                 else {
  37.                     if (p[pat] == 0) p[pat] = -2;
  38.                     else if (p[pat] == 1) p[pat] = -1;
  39.                     else p[pat]--;
  40.                 }
  41.             }
  42.             pat = (pat * 2 + bits[i])&((1 << SZ) - 1);
  43.             assert(pat >= 0 && pat < (1 << SZ));
  44.         }
  45.     }
  46.     pat = 0;
  47.     for (int i = 0; i < t; i++) {
  48.         if (bits[i] == 2) {
  49.             int x = 0;
  50.             if (p[pat] > 0) x = 1;
  51.             if (p[pat] == 0) cerr << "ouch " << i << endl;
  52.             if (i < SZ) cerr << "interesting " << i << endl;
  53.             bits[i] = x;
  54.             cout << x;
  55.         }
  56.         pat = (pat * 2 + bits[i])&((1 << SZ) - 1);
  57.         assert(pat >= 0 && pat < (1 << SZ));
  58.     }
  59.     cout << endl;
  60. }
  61.  
  62. int main() {
  63.     cerr << "one" << endl;
  64.     proc();
  65.     cerr << "two" << endl;
  66.     proc();
  67.     return 0;
  68.  
  69. }
Advertisement
Add Comment
Please, Sign In to add comment