ACM: polya模拟 数论题 poj 1026

来源:互联网 发布:深圳阿里云大厦 编辑:程序博客网 时间:2024/05/23 18:47

                                                                  Cipher

Description

 

Bob and Alice started to use a brand-new encoding scheme.Surprisingly it is not a Public Key Cryptosystem, but theirencoding and decoding is based on secret keys. They chose thesecret key at their last meeting in Philadelphia on February 16th,1996. They chose as a secret key a sequence of n distinct integers,a1 ; . . .; an, greater than zero and less or equal to n. Theencoding is based on the following principle. The message iswritten down below the key, so that characters in the message andnumbers in the key are correspondingly aligned. Character in themessage at the position i is written in the encoded message at theposition ai, where ai is the corresponding number in the key. Andthen the encoded message is encoded in the same way. This processis repeated k times. After kth encoding they exchange theirmessage.

The length of the message is always less or equal than n. If themessage is shorter than n, then spaces are added to the end of themessage to get the message with the length n.

Help Alice and Bob and write program which reads the key and then asequence of pairs consisting of k and message to be encoded k timesand produces a list of encoded messages.

Input

The input file consists of several blocks. Each block has anumber 0 < n <= 200 in the firstline. The next line contains a sequence of n numbers pairwisedistinct and each greater than zero and less or equal than n. Nextlines contain integer number k and one message of ascii charactersseparated by one space. The lines are ended with eol, this eol doesnot belong to the message. The block ends with the separate linewith the number 0. After the last block there is in separate linethe number 0.

Output

Output is divided into blocks corresponding to the input blocks.Each block contains the encoded input messages in the same order asin input file. Each encoded message in the output file has thelenght n. After each block there is one empty line.

Sample Input

10

4 5 3 7 2 8 1 6 10 9

1 Hello Bob

1995 CERC

0

0

Sample Output

BolHeol b

C RCE

题意: 给你置换的编码表格, 再给你重复编码的次数和序列 , 求出新序列.

 

解题思路:

               1. 4 5 3 7 2 8 1 6 10 9

                   1 2 3 4 5 6 7 8  9 10

              循环有: (4 1 7) (5 2) (3) (8 6) (10 9)

              循环节是: 编码次数 % 循环长度.

 

代码:

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 205

int n, k;
char str1[MAX], str2[MAX];
int a[MAX];
int cir[MAX];

int main()
{
//   freopen("input.txt","r",stdin);
   while(scanf("%d",&n) != EOF&& n != 0)
    {
      for(int i = 1; i <= n; ++i)
         scanf("%d",&a[i]);
      for(int i = 1; i <= n; ++i)
      {
         int j = i;
         int t = 1;
         while(a[j] != i)
         {
            t++;
            j = a[j];
         }
         cir[i] = t;
      }
      
      while(scanf("%d",&k) != EOF&& k != 0)
      {
         getchar();
         gets(str1+1);
         int max = -1;
         int len = strlen(str1+1);
         memset(str2,' ',sizeof(str2));
         
         for(int i = 1; i <= len;++i)
         {
            int x = k % cir[i];
            int j = i;
            while(x--)
               j = a[j];
            str2[j] = str1[i];
            if(j > max) max = j;
         }
         for(int i = 1; i <= max;++i)
            str1[i] = str2[i];
         str1[max+1] = '\0';
         printf("%s",str1+1);
         for(int i = n-max; i >= 0;--i)
            printf(" ");
         printf("\n");
      }
      printf("\n");
    }
    return0;
}

 

0 0