首页 > 其他分享 >情报破译 题解

情报破译 题解

时间:2023-10-04 19:44:35浏览次数:44  
标签:a1 ch 情报 题解 破译 rd int full res

img

\(d<n\le 2e5,m\le 10,1\le p\le 10^9,0\le a_i\le 1e9\)

每个位运算之间独立,所以我们可以构造一个

\(\{2^{k-1},2^{k-1}.....\}\)

和一个

\(\{0,0,0...\}\)

的数组,让他们倍增去做如上运算,最后用他们把 \(p\) 轮拼出来,我们就知道了 \(i\) 位置上二进制下第 \(j\) 位如果是 \(0\) ,最后会变成什么,反之亦然。

设\(F_{i,j}\)表示i位置 \(full(2^k-1)\) 做了\(2^j\)轮以后的情况

\(G_{i,j}\)表示i位置 \(zero(0)\) 做了\(2^j\)轮以后的情况

转移为

\(F_{i,j}=(F_{i,j-1} \& F_{i+2^{j-1}*(m*d),j-1})|((\sim F_{i,j-1})\&(G_{i+2^{j-1}*(m*d),j-1}))\)

分别表示位置为1再做\(2^{j-1}\)会变成什么和为0位置再做\(2^{j-1}\)会变成什么

G转移同理,两者互相转移

Tip:拼 \(p\) 时别忘了位移数组,记录已经做的轮数(调了1个小时

时间复杂度:\(O(nm+n\log V)\)

code:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define fr first
#define sc second
inline int rd() {
    int res = 0, f = 1;
    char ch = getchar();
    while (!isdigit(ch)) {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (isdigit(ch)) {
        res = res * 10 + (ch - '0');
        ch = getchar();
    }
    return res * f;
}
const int N = 2e5 + 10;
int n, m, d, p, mx;
int b[N], full;
char opt[N][3];
deque<int> now;
int f[N][36], g[N][36], a1[N], a0[N];
signed main() {
    // freopen("A.in", "r", stdin);
    // freopen("A.out", "w", stdout);
    n = rd();
    m = rd();
    d = rd();
    p = rd();
    for (int i = 0; i < n; i++) {
        b[i] = rd();
        mx = max(mx, __lg(b[i]) + 1);
        now.push_back(b[i]);
    }
    full = (1ll << 35) - 1;
    for (int i = 1; i <= m; i++)
        scanf("%s", opt[i]);
    for (int i = 0; i < n; i++)
        f[i][0] = full;
    for (int i = 1; i <= m; i++) {
        for (int j = 0; j < d; j++) {
            now.push_back(now.front());
            now.pop_front();
        }
        for (int j = 0; j < n; j++) {
            if (opt[i][0] == 'x')
                f[j][0] ^= now[j], g[j][0] ^= now[j];
            else if (opt[i][0] == 'a')
                f[j][0] &= now[j], g[j][0] &= now[j];
            else if (opt[i][0] == 'o')
                f[j][0] |= now[j], g[j][0] |= now[j];
        }
    }
    for (int j = 1; j <= 35; j++) {
        for (int i = 0; i < n; i++) {
            f[i][j] =
                (f[i][j - 1] &
                 f[(i + (1ll << (j - 1)) % n * m % n * d % n) % n][j - 1]) |
                ((full ^ f[i][j - 1]) &
                 g[(i + (1ll << (j - 1)) % n * m % n * d % n) % n][j - 1]);
            g[i][j] =
                ((full ^ g[i][j - 1]) &
                 g[(i + (1ll << (j - 1)) % n * m % n * d % n) % n][j - 1]) |
                (g[i][j - 1] &
                 f[(i + (1ll << (j - 1)) % n * m % n * d % n) % n][j - 1]);
        }
    }
    for (int i = 0; i < n; i++)
        a1[i] = full;
    int res = 0;
    for (int i = 0; (1ll << i) <= p; i++) {
        if ((p >> i) & 1) {
            for (int j = 0; j < n; j++) {
                a1[j] = (a1[j] & f[(j + res * d % n * m % n) % n][i]) |
                        ((full ^ a1[j]) & g[(j + res * d % n * m % n) % n][i]);
                a0[j] = (a0[j] & f[(j + res * d % n * m % n) % n][i]) |
                        ((full ^ a0[j]) & g[(j + res * d % n * m % n) % n][i]);
            }
            res |= (1ll << i);
            res %= n;
        }
    }
    // for (int i = 0; i < n; i++) {
    // for (int j = 0; j < 3; j++)
    // printf("%lld", (a1[i] >> j) & 1);
    // puts("");
    // }
    for (int i = 0; i < n; i++) {
        int res = 0;
        for (int j = 0; j <= 35; j++) {
            if ((b[i] >> j) & 1)
                res |= (((a1[i] >> j) & 1) << j);
            else
                res |= (((a0[i] >> j) & 1) << j);
        }
        printf("%lld ", res);
    }
    return 0;
}

标签:a1,ch,情报,题解,破译,rd,int,full,res
From: https://www.cnblogs.com/Linnyx/p/17742629.html

相关文章

  • 国标GB28181协议下视频监控平台EasyGBS播放器起播慢或延迟高问题解决方案
    GB28181视频监控国标平台EasyGBS是基于国标GB28181协议、支持多路设备同时接入的视频监控/视频云服务平台,支持对多平台、多终端分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。国标GB28181平台EasyGBS可提供视频直播监控、云端录像、云存储、检索回放、智能告警、语音对讲、平......
  • P1025 [NOIP2001 提高组] 数的划分 题解
    题目传送门本题共有两种方法,分别是递归深搜和动态规划方法一:递归深搜Solution从小到大一一枚举每一个划分的数,。只要找到一种方案就记录,具体细节代码中有注释。Code#include<bits/stdc++.h>usingnamespacestd;intn,k,ans;voiddfs(intstart,intstep,intsum){......
  • 【题解】Typo
    TypoDescreption求反转一个不合法的括号序列中的一位使其成为一个合法序列的方案数(保证方案一定存在)Solution其实也就是一道较复杂的模拟题先判断哪一类括号数量更多,因为一定是将数量多的括号改成数量少的才有可能变为合法序列,这里就先用左括号举例记录每个位置时没有配对的......
  • CF1234(Div. 3) 题解(A to E)
    AEqualizePricesAgain题解题目大意\(n\)个商品,每个商品价格为\(a_i\),求一个最小的价格\(x\),使得不亏本(即\(\sum\limits_{i=1}^n{(a_i-x)}\ge0\))。解题思路输出平均数向上取整(即\(\left\lceil(\sum\limits_{i=1}^n{a_i})\divn\right\rceil\))即可。代码#include<bit......
  • 项链 题解
    随机化写法很强,但是这里不说。这里只记录数据结构写法。枚举右端点,快速找左端点。首先一种合法的方案中,一种颜色只会有两种情况。全部在区间中及全部在区间外。对于区间外的情况,也就是最后一次出现的位置\(p\)大于右端点\(r\),我们可以维护当前枚举右端点之前的所有颜色非......
  • CF1203(Div. 3) 题解(C to F1)
    由于太懒了,所以不想(会)写\(\texttt{AB}\)和\(\texttt{F2}\)。CCommonDivisors题解题目大意给定一个长度为\(n\)的数列\(\{a_i\}\),求\(\sigma(\gcd\limits_{i\in[1,n]}\{a_i\})\)。解题思路先算出所有元素的最大公因数,如果最大公因数\(g\)为\(1\),即所有元素两两......
  • CF1873(Div. 4) 题解 (A to E)
    AShortSort题解题目大意给定一个长度为\(3\)、由\(a,b,c\)组成的字符串,问可以不变或交换两个字符是的变为\(\texttt{abc}\)。解题思路由于大小固定,所以预处理可行的字符串(仅包含\(\texttt{abcacbbaccba}\))即可。代码#include<bits/stdc++.h>usingnamespacest......
  • 题解 CF1034C【Region Separation】/ SS221116D【Xiong AK 10 IOI】
    很妙的性质题!全是意识流证明见过吗?problem每次选一个非空边集删掉,谓之曰砍树。砍树后需要满足每个连通块的点权和相同。在一个方案中可以砍很多次树,都要满足砍树后的要求。一共有多少种合法方案呢?\(n\leq10^6,1\leqa_i\leq10^9\)。solution假如我们将树砍成\(k\)个连通......
  • 传奇团子师傅题解
    传奇团子师傅题解(模拟退火)申明:本篇题解借鉴了:https://www.luogu.com.cn/blog/SDNetFriend/solution-p7218这篇博客(主要在bitset部分)。题意:给你个矩阵,包含三种颜色,一个美丽串要求你横着或者竖着或者斜着串成一串的三个颜色有特定的顺序,求拿取最多美丽串的方案是什么。题目分......
  • 【UVA 442】Matrix Chain Multiplication 题解(栈)
    假设您必须计算一个表达式,如ABCDE,其中A、B、C、D和E是矩阵。由于矩阵乘法是关联的,所以执行乘法的顺序是任意的。然而,所需的初等乘法的数量很大程度上取决于求值顺序您可以选择。例如,设A为5010矩阵,B为1020矩阵,C为205矩阵。有两个计算ABC的不同策略,即(AB)C和A(B*C)。第一个需要1500......