poj 1026 Cipher(置换群T_T)

跪了一个下午了,才发现在循环哪里写错了WA到死。

题目意思是:

10
4 5 3 7 2 8 1 6 10 9
1 Hello Bob
1995 CERC
0
0

给出了一个长为N的序列,和需要按这序列交换k次的字符串 (如长度不足n,就补空格) .交换方式时字符串下标为i与序列中num[i]进行交换。

做法,还是根据循环节,既然它都说按照这个关系交换的,那就有个规律进过L就换回原来位置,这个L就是循环节长度,交换k次,k个L略去K%L就是其最后的结果。

k没限制大小所以直接模拟必然会超时.


/*
Problem ID:poj 1026
Meaning: 将i上的字符与num[i]交换k次
Analyzing:置换群组合数学
*/
#include <iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>

using namespace std;
#define FOR(i,s,t) for(int i=(s); i<(t); i++)
#define LL long long
#define BUG puts("here!!!")
#define STOP system("pause")
#define file_r(x) freopen(x, "r", stdin)
#define file_w(x) freopen(x, "w", stdout)

#define maxn 205

LL gcd(LL a,LL b) {return a?gcd(b%a,a):b;}

int main(){
    int n,num[maxn],k,L[maxn];
    char str[maxn],str1[maxn];
    while(scanf("%d",&n)&&n){
        FOR(i,0,n) {scanf("%d",&num[i]);num[i]-=1;}
        memset(L,0,sizeof(L));
        FOR(i,0,n){
            int j=num[i];
            while(1){
                L[i]++;
                j=num[j];
                if(j==num[i]) break;
            }
        }
        while(scanf("%d",&k)&&k){
            getchar();
            gets(str);
            int len=strlen(str);
            FOR(i,len,n) str[i]=' ';
            str[n]='\0';
            memset(str1,0,sizeof(str1));
            strcpy(str1,str);
            FOR(i,0,n){
                int l=i,r=i;
                FOR(j,0,k%L[i])
                    r=num[r];
                str1[r]=str[l];
            }
            puts(str1);
            }
            puts("");
        }
        return 0;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值