POJ 1026 Cipher

//11170981	c00h00g	1026	Accepted	404K	110MS	G++	1120B	2013-01-11 22:24:41
//只需要考虑每一个字符的周期,使用circle数组记录
//比如说题目中的例子 1->4->7->1可知,这三个数的周期是3,只需要使用k%3就可以知道需要操作的次数 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int a[205];
int circle[205];
char src[205];
char dst[205];
int n,k;

//计算每个字符的周期 
int compute_loop(){
    for(int i=1;i<=n;i++){
        int j=i,cur=i,num=1;
        while(a[cur]!=j){
            num++;
            cur=a[cur];
        }
        circle[i]=num;
    }
}
int main(){
    while(scanf("%d",&n)!=EOF){
        if(n==0)
            break;
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        compute_loop();
        while(scanf("%d",&k)){
            if(k==0)
                break;
            gets(src);
            int len=strlen(src+1);
            if(len<n){
                for(int i=len+1;i<=n;i++)
                    src[i]=' ';
                src[n+1]='\0'; 
            }
            for(int i=1;i<=n;i++){
                int id=i;
                for(int j=0;j<k%circle[i];j++)
                    id=a[id];
                dst[id]=src[i];
            }
            dst[n+1]='\0';
            printf("%s\n",dst+1);
        }
        printf("\n");
    }    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值