Jurassic Remains

来源:互联网 发布:如何设置淘宝直通车 编辑:程序博客网 时间:2024/05/29 11:20

密码学中的中途相遇攻击原理

#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#include <queue>#include <algorithm>#include <vector>#include <cstring>#include <stack>#include <cctype>#include <utility>#include <map>#include <string>#include <climits> #include <set>#include <string> #include <sstream>#include <utility>#include <ctime>//#pragma comment(linker, "/STACK:1024000000,1024000000") using std::priority_queue;using std::vector;using std::swap;using std::stack;using std::sort;using std::max;using std::min;using std::pair;using std::map;using std::string;using std::cin;using std::cout;using std::set;using std::queue;using std::string;using std::istringstream;using std::getline;using std::make_pair;using std::greater; const int MAXN((1 << 12)+10);struct NODE{int state1, state2, num;friend bool operator < (const NODE &op1, const NODE &op2){return op1.state1 < op2.state1||(op1.state1 == op2.state1 && op1.num > op2.num);}};NODE node[MAXN];int count = 0;int arr[MAXN];int *point;int N, n1, n2;void dfs1(int dep, int ts1, int ts2, int num){if(dep == n1+1){++count;node[count].state1 = ts1;node[count].state2 = ts2;node[count].num = num;return;}dfs1(dep+1, ts1, ts2, num);dfs1(dep+1, ts1^arr[dep], ts2|(1 << (dep-1)), num+1);}bool find(int goal, int &tind){int l = 1, r = count;while(l < r){int m = (l+r) >> 1;if(node[m].state1 < goal)l = m+1;elser = m;}if(goal == node[l].state1){tind = l;return true;}return false;}int ans, rans;void dfs2(int dep, int ts1, int ts2, int num){if(dep == n2+1){int tind;if(find(ts1, tind)){if(node[tind].num+num > ans){ans = node[tind].num+num;rans = (ts2 << n1)|node[tind].state2;}}return;}dfs2(dep+1, ts1, ts2, num);dfs2(dep+1, ts1^point[dep], ts2|(1 << (dep-1)), num+1);}int main(){while(~scanf("%d", &N)){while(getchar() != '\n');char temp;for(int i = 1; i <= N; ++i){arr[i] = 0;while(temp = getchar(), temp != '\n'){arr[i] ^= (1 << (temp-'A'));}}n1 = N >> 1;n2 = N-n1;count = 0;dfs1(1, 0, 0, 0);sort(node+1, node+1+count);int tc = 1;for(int i = 2; i <= count; ++i)if(node[i].state1 > node[i-1].state1)node[++tc] = node[i];count = tc;ans = rans = 0;;point = arr+n1;dfs2(1, 0, 0, 0);printf("%d\n", ans);bool print_s(false);for(int i = 0; i < N; ++i)if(rans&(1 << i)){if(print_s)printf(" ");printf("%d", i+1);print_s = true;}printf("\n");}return 0;}


原创粉丝点击