[Bzoj5043][Lydsy1709月赛]密码破译(按位dp)
2018-04-13 11:12
676 查看
5043: [Lydsy1709月赛]密码破译
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 477 Solved: 125
[Submit][Status][Discuss]
Description
小Q发明了一个新的加密算法,对于一个长度为n的非负整数序列a_1,a_2,...,a_n,他会随机选择一个非负整数k,
将每个数都异或上k得到b_1,b_2,...,b_n,即b_i=a_i xor k。不幸的是,健忘的小Q睡了一觉之后就把密钥k忘得 一干二净了,不过他隐约记得a_1+a_2+...+a_n的值为m,你能帮他找到一个可行的密钥吗Input
第一行包含两个整数n,m(1<=n<=100000,0<=m<2^{60}),分别表示序列的长度以及加密前所有数的和。 第二行包含n个整数b_1,b_2,...,b_n(0<=b_i<2^{60}),表示加密后的序列。
Output
输出一个非负整数k,若无解输出-1,若有多组解,输出最小的k。
Sample Input
3 5 1 2 3
Sample Output
1
HINT
Source
分析:
这种与位运算有关的,大多数都是拆开按位从高到低贪心,或者从低到高dp。
这道题就是定义f[i][j]表示i位能向下一位进j个(1<<i);
记录每一位数字总和,讨论每一位k是0或1再与m的每一位是0或1作比,从低到高dp一遍就好了
j最多是n所以复杂度是O(60*n)
AC代码:
# include <iostream> # include <cstdio> using namespace std; const int N = 1e5 + 12; typedef long long LL; const LL inf = 1LL << 61; LL f[61] ,p[61],m,x;int n; int main() { scanf("%d %lld",&n,&m); for(int i = 1;i <= n;i++) { scanf("%lld",&x); for(int j = 60;~j;j--) p[j + 1] += x >> j & 1; } for(int i = 0;i <= n;i++) for(int j = 60;~j;j--) f[j][i] = inf; f[0][0] = 0; for(int j = 0;j <= 59;j++) { for(int i = 0;i <= n;i++) { if(((p[j + 1] + i) & 1) == (m >> j & 1)) f[j + 1][(p[j + 1] + i) >> 1] = min(f[j + 1][(p[j + 1] + i) >> 1],f[j][i]); if(((n - p[j + 1] + i) & 1) == (m >> j & 1)) f[j + 1][(n - p[j + 1] + i) >> 1] = min(f[j + 1][(n - p[j + 1] + i) >> 1],f[j][i] + (1LL << j)); } } printf("%lld\n",f[60][0] == inf ? -1 : f[60][0]); }
相关文章推荐
- BZOJ 5043: 密码破译 dp
- bzoj5043: 密码破译
- bzoj 5043: 密码破译
- [数学]bzoj5043密码破译
- [bzoj5043]密码破译
- bzoj5043 密码破译
- bzoj1559 [JSOI2009]密码(AC自动机+状压DP)
- [BZOJ 1559] [JSOI2009] 密码 【AC自动机DP】
- BZOJ 5128([Lydsy12月赛]寻找母串-区间dp)
- BZOJ 4884 [Lydsy2017年5月月赛]太空猫(单调DP)
- BZOJ 4832 [Lydsy2017年4月月赛]抵制克苏恩 期望dp
- BZOJ 5072 [Lydsy 十月月赛] 树DP 解题报告
- bzoj 4884 [Lydsy2017年5月月赛]太空猫(简单dp)
- [BZOJ4919][Lydsy六月份月赛 .C][树上DP][启发式合并]大根堆
- bzoj 1559 密码 AC自动机+状压DP
- BZOJ_5359_[Lydsy1805月赛]寻宝游戏_DP
- 【bzoj5072】[Lydsy十月月赛]小A的树 树形背包dp
- 破译密码(区间DP)
- 【dp-关于决策点】[Lydsy12月赛] BZOJ5124波浪序列 BZOJ5125小Q的书架
- BZOJ 5072: [Lydsy十月月赛]小A的树 树形dp