Decryption sequence 【模拟】【思维】

来源:互联网 发布:淘宝卖童装客服 编辑:程序博客网 时间:2024/06/06 02:18

问题 I: Decryption sequence

时间限制: 1 Sec 内存限制: 128 MB
 

题目描述

加密是个被广泛关注的问题,现在给出一种对数列加密的算法:

假设有原数列S,S是1到2n2n的一个排列(下标从1开始),因此其中共有2n2n个整数。

现在定义一个数列P,满足:

Pi={ji(Simod2=1Sj=Si+1)()Pi={j(Simod2=1且Sj=Si+1)i(否则)

同时我们通过以下操作由S生成另一个数列T:第一步将S所有奇元素删除,第二步把剩下的所有偶元素按照原来的位置关系排列好,并都除以2,这样得到一个新的数列。

例如:

对于数列S={4,8,3,2,5,7,1,6},我们可以生成数列P={1,2,1,4,8,2,4,8},数列T={2,4,1,3}。

我们把数列P称为密文,T称为密钥,顾名思义通过这两个数列,可以还原出原数列。

现在请你完成数列的解密程序。

输入

多组测试数据(不超过10组),请处理到文件结束。

第一行是一个正整数m(0<m<1000<m<100),代表原数列元素的个数。

第二行有m个正整数PiPi,表示数列P。

第三行有m/2个正整数TiTi,表示数列T。

输出

请输出原数列S,元素中间以一个空格隔开。

样例输入

81 2 1 4 8 2 4 82 4 1 3

样例输出

4 8 3 2 5 7 1 6
思路: 当时不知道怎么了。。看了 半个多小时,硬是没有任何思路,,真是要死。。
 现在再来看看,,还是能看出点端倪,真是。。。看来临场发挥还是不行呐,以后多参加点比赛,让自己尽快适应那种环境,
 这道题,其实就是 弄清楚 主要就是在p序列和s序列的关系密切,。好难说明白。看代码把
代码
#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#include<queue>#define inf 0x3f3f3f#define M  100+10int main(){int m;while(~scanf("%d",&m)){int p[M]={0};int t[M]={0};for(int i=1;i<=m;i++)scanf("%d",&p[i]);for(int i=1;i<=m/2;i++){int k;scanf("%d",&k);t[i]=k*2;//  还原t序列}int v[M]={0};    // int j=1;for(int i=1;i<=m;i++){if(p[i]==i) //  只要相等 就表明这个是原来的S值是偶数{p[i]=t[j++];   //  依次将t中的偶数传入就可以v[i]=1;  //  并且记录这个数字是经过转换的}for(int i=1;i<=m;i++){if(!v[i])    //对于没有经历转换的数字{p[i]=p[p[i]]-1;    // 将s到p序列的  转换条件  逆向一下就可以了}}
printf("%d",p[1]);  // 输出答案for(int i=2;i<=m;i++)printf(" %d",p[i]);putchar('\n');}return 0;}
0 0
原创粉丝点击