zoukankan      html  css  js  c++  java
  • 2018 ACM-ICPC 沈阳网络赛 I. Lattice's basics in digital electronics[模拟+bitwise trie]

    我好咸啊,一个多小时才写完这sb题

    给一个长2e5的16进制原串(要转成2进制)
    要解密这个串
    首先要判断是否合法,把原串分成9位一段(最后不够9个的不要了),对于每段 统计前8位1的个数 第9位是校验码,1的个数是偶数 第9位是1 或者1的个数是奇数 第九位是0 都是合法的 否则不合法
    然后把合法的串拼起来
    给出一些(<=256)解密规则 形如 x(十进制) y(二进制) 代表y解密后是x 保证任何一个y不会是其他的y的前缀
    要求输出解密后的串

    #include <bits/stdc++.h>
    using namespace std;
    
    char s[MAXN*4], s2[MAXN*4], tmp[15];
    int Len, n, len, x, top, Case, top1;
    struct bittrie {
      int t[MAXN*4][2], cnt;
      int isword[MAXN*4];
      inline void init() {
        mset(t, 0), mset(isword, 0); cnt = 0;
      }
      inline void insert(int cur, char *p) {
        int u = 0;
        while (*p) {
          int v = *p++ - '0';
          int &x = t[u][v];
          u = x ? x : x = ++cnt;
        }
        isword[u] = cur;
      }
      inline int query(char *p) {
        int u = 0, tt = 0;
        while (*p) {
          int v = *p++ - '0';
          u = t[u][v];
          ++tt;
          if (isword[u]) return putchar(isword[u]), tt;
        }
      }
    }T;
    
    
    int main() {
      in, Case;
      while(Case--) {
        T.init();
        in, Len, n;
        top1 = top = 0;
        lop(i,1,n) {
          in, x, tmp;
          T.insert(x, tmp);
        }
        in, s+1;
        for(int i = 1; s[i]; ++i) {
          int tt;
          if (islower(s[i])) s[i] -= 32;
          if (isdigit(s[i])) tt = s[i] - '0';
          else tt = s[i] - 'A' + 10;
          for(int j = 3; j >= 0; --j) s2[++top] = ((tt & (1 << j)) != 0) + '0';
          s[i] = 0;
        }
        top = (top / 9) * 9;
        assert(top%9==0);
        for(int i = 1; i <= top; i += 9) {
          int cnt = 0;
          for(int j = i; j <= i + 7; ++j) if (s2[j] == '1') ++cnt;
          if ((cnt & 1) != s2[i+8] - '0')
          for(int j = i; j <= i + 7; ++j) s[++top1] = s2[j];
        }
        s[top1+1] = '';
        int cur = 1, tt = 0;
        while (cur <= top1) {
          cur += T.query(s+cur);
          if (++tt == Len) break;
        }
        puts("");
      }
      return 0;
    }
    
  • 相关阅读:
    jQuery(八):属性操作
    jQuery(七):节点操作
    jQuery(六):value值操作
    jQuery(五):文本操作
    jQuery(四):HTML代码操作
    jQuery(三):样式操作
    jQuery(二):jQuery选择器
    JavaScript(九):JavaScript中的内置对象
    JavaScript(五):变量的作用域
    如何让命名变得优雅
  • 原文地址:https://www.cnblogs.com/storz/p/10191107.html
Copyright © 2011-2022 走看看