poj1026

题目大意:暗号
Bod 和 Alice 计划使用一种全新的编码方案,令人惊讶的是这不是一个公开的公匙密码,但是他们的编码基于密匙,在 Philadelphia on February 16th他们的会议中选择了密匙,他们选择的密匙是一个两两不等的整数序列,a1.....an,大于0并且小于等于n,编码基于一下原则。下面的信息是关键,这样关键的人物信息和数字相对齐,一个字符在i位置,编码的时候把他放在ai,ai就是相应数字位置的关键,并且他们以同样的编码信息进行编码,这个过程重复k次,在k次以后他们交换彼此的编码。
这段信息的长度小于或者等于n,如果小于n,那么就在信息的后面能添加空格使它等于n,
写一个程序完成这个编码

发现因为没有重复的数字,所以有个内层的循环可以利用。试试吧->(也不知道k有多大,真坑)

发现一个最坑的地方,数字和后面的字符串只有一个空格隔开,多余的空格都是属于后面字符串的,真的是非常坑啊,只能用getchar过滤一个空格!!!!

 

 #include<stdio.h>

#include< string.h>
#include<algorithm>
using  namespace std;
#define maxn 1005
struct node
{
     int num, k;
}a[maxn];
int Find( int x,  int k,  int e);
int GetIndex( int i,  int k);
int main()
{
     int i, j, n;
     while(scanf( " %d ", &n), n)
    {
         for(i= 1; i<=n; i++)
        {
            scanf( " %d ", &a[i].num);
            a[i].k =  0;
        }
         for(i= 1; i<=n; i++)
        {
             if(!a[i].k)
                a[i].k = Find(i,  1, i);
        }
         int k;
         while(scanf( " %d ", &k), k!= 0)
        {
             char s1[maxn]={ 0}, s2[maxn]={ 0};
            getchar();
            gets(s1+ 1);
             for(i=strlen(s1+ 1)+ 1; i<=n; i++)
                s1[i] =  '   ';
             for(i= 1; i<=n; i++)
            {
                j = GetIndex(i, k);
                s2[j] = s1[i];
            }
             for(i=n; s2[i]== '   '; i--)
                s2[i] =  0;
            printf( " %s\n ", s2+ 1);
        }
        printf( " \n ");
    }
     return  0;
}
int Find( int x,  int k,  int e)
{
     if(a[x].num != e)
         return a[x].k = Find(a[x].num, k+ 1, e);
     return a[x].k = k;
}
int GetIndex( int i,  int k)
{
     int n=k%a[i].k;
     while(n--)
        i = a[i].num;
     return i;
}

你可能感兴趣的:(poj)