zoukankan      html  css  js  c++  java
  • CodeForces 923C Perfect Security

    C. Perfect Security
    time limit per test3.5 seconds
    memory limit per test512 megabytes
    inputstandard input
    outputstandard output
    Alice has a very important message M consisting of some non-negative integers that she wants to keep secret from Eve. Alice knows that the only theoretically secure cipher is one-time pad. Alice generates a random key K of the length equal to the message’s length. Alice computes the bitwise xor of each element of the message and the key (, where denotes the bitwise XOR operation) and stores this encrypted message A. Alice is smart. Be like Alice.

    For example, Alice may have wanted to store a message M = (0, 15, 9, 18). She generated a key K = (16, 7, 6, 3). The encrypted message is thus A = (16, 8, 15, 17).

    Alice realised that she cannot store the key with the encrypted message. Alice sent her key K to Bob and deleted her own copy. Alice is smart. Really, be like Alice.

    Bob realised that the encrypted message is only secure as long as the key is secret. Bob thus randomly permuted the key before storing it. Bob thinks that this way, even if Eve gets both the encrypted message and the key, she will not be able to read the message. Bob is not smart. Don’t be like Bob.

    In the above example, Bob may have, for instance, selected a permutation (3, 4, 1, 2) and stored the permuted key P = (6, 3, 16, 7).

    One year has passed and Alice wants to decrypt her message. Only now Bob has realised that this is impossible. As he has permuted the key randomly, the message is lost forever. Did we mention that Bob isn’t smart?

    Bob wants to salvage at least some information from the message. Since he is not so smart, he asks for your help. You know the encrypted message A and the permuted key P. What is the lexicographically smallest message that could have resulted in the given encrypted text?

    More precisely, for given A and P, find the lexicographically smallest message O, for which there exists a permutation π such that for every i.

    Note that the sequence S is lexicographically smaller than the sequence T, if there is an index i such that Si < Ti and for all j < i the condition Sj = Tj holds.

    Input
    The first line contains a single integer N (1 ≤ N ≤ 300000), the length of the message.

    The second line contains N integers A1, A2, …, AN (0 ≤ Ai < 230) representing the encrypted message.

    The third line contains N integers P1, P2, …, PN (0 ≤ Pi < 230) representing the permuted encryption key.

    Output
    Output a single line with N integers, the lexicographically smallest possible message O. Note that all its elements should be non-negative.

    Examples
    inputCopy
    3
    8 4 13
    17 2 7
    output
    10 3 28
    inputCopy
    5
    12 7 87 22 11
    18 39 9 12 16
    output
    0 14 69 6 44
    inputCopy
    10
    331415699 278745619 998190004 423175621 42983144 166555524 843586353 802130100 337889448 685310951
    226011312 266003835 342809544 504667531 529814910 684873393 817026985 844010788 993949858 1031395667
    output
    128965467 243912600 4281110 112029883 223689619 76924724 429589 119397893 613490433 362863284
    Note
    In the first case, the solution is (10, 3, 28), since , and . Other possible permutations of key yield messages (25, 6, 10), (25, 3, 15), (10, 21, 10), (15, 21, 15) and (15, 6, 28), which are all lexicographically larger than the solution.

    上传一份推倒思路,我懒得打字了!
    这里写图片描述

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int a[300005];
    typedef struct Trie
    {
        int sum;
        Trie *next[2];
    }Trie;
    void Create(Trie *root, int x)
    {
        int now, i;
        Trie *p = root;
        for(i=30;i>=0;i--)
        {
            now = 0;
            if(x&(1<<i))
                now = 1;
            if(p->next[now]==NULL)
            {
                Trie *temp = new Trie;
                temp->next[0] = temp->next[1] = NULL;
                temp->sum = 0;
                p->next[now] = temp;
            }
            p = p->next[now];
            p->sum++;
        }
    }
    int Query(Trie *root, int x)
    {
        int now, i, ans = 0;
        Trie *p = root;
        for(i=30;i>=0;i--)
        {
            now = 0;
            if(x&(1<<i))
                now = 1;
            if(p->next[now]==NULL || p->next[now]->sum==0)
                p = p->next[now^1], ans += (1<<i);
            else
                p = p->next[now];
            p->sum--;
        }
        return ans;
    }
    int main(void)
    {
        int n, i, x;
        Trie *root = new Trie;
        root->next[0] = root->next[1] = NULL;
        root->sum = 0;
        scanf("%d", &n);
        for(i=1;i<=n;i++)
            scanf("%d", &a[i]);
        for(i=1;i<=n;i++)
        {
            scanf("%d", &x);
            Create(root, x);
        }
        for(i=1;i<=n;i++)
            printf("%d ", Query(root, a[i]));
        puts("");
        return 0;
    }
    
  • 相关阅读:
    647. Palindromic Substrings
    151. Reverse Words in a String
    iOS UICollectionView(转一) XIB+纯代码创建:cell,头脚视图 cell间距
    iOS tableViewCell 在自定义高度方法中遇到的问题,cell高度为0,cell显示不出来,cell直接显示第几个而不是...cell显示个数不对
    iOS自定义文字高度添加行间距
    iOS 去掉小数点后边多余的0
    iOS 接收新消息通知调用系统声音 震动
    iOS 正则表达式使用(转)
    iOS实现类似QQ的好友列表,自由展开折叠(在原来TableView的基础上添加一个字典,一个Button)
    iOS 工程默认只允许竖屏,在单独界面进行横竖转换,屏幕旋转
  • 原文地址:https://www.cnblogs.com/bryce1010/p/9386989.html
Copyright © 2011-2022 走看看