poj1026 Cipher 置换群

题意:给一个序列a,a[ i ]表示当前在i位置,经过一次encode变到a[ i ]的位置。再给一个字符串,s0, s1, s2,...,sn-1(长度不够的用空格

补上)。s[ i ]在a[ i ]位置输出得到一个新的串,重复这个过程k次,求最后的串。

思路:我们首先找到对于每个a[ i ]经过几次encode回到原来的位置,存在cnt[a[ i ]]中,然后用(k-1)%cnt[ a[ i ] ] 最后确定str[ i ]最终在

哪个位置。最后注意下输入输出的格式就好。详见代码:

// file name: poj1026.cpp //
// author: kereo //
// create time:  2014年09月02日 星期二 14时48分12秒 //
//***********************************//
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<stack>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAXN=200+100;
const int inf=0x3fffffff;
#define L(x) (x<<1)
#define R(x) (x<<1|1)
int n,k;
int a[MAXN],cnt[MAXN];//记录每个数所在循环的元素个数
char str[MAXN],ans[MAXN];
int main()
{
	while(~scanf("%d",&n) && n){
		for(int i=0;i<n;i++){
			scanf("%d",&a[i]); a[i]--;
		}
		while(~scanf("%d",&k) && k){
			getchar();
			gets(str);
			int len=strlen(str);
			if(len<n)
				for(int i=len;i<n;i++) str[i]=' ';
			k--;
			int tmp;
			memset(cnt,0,sizeof(cnt));
			for(int i=0;i<n;i++) if(!cnt[a[i]]){
				tmp=a[i]; cnt[tmp]++;
				while(tmp!=i){
					cnt[a[i]]++; tmp=a[tmp];
				}
			}
			int pos;
			for(int i=0;i<n;i++){
				tmp=k%cnt[a[i]];
				pos=a[i];
				while(tmp--) pos=a[pos];
				ans[pos]=str[i];
			}
			for(int i=0;i<n;i++)
				printf("%c",ans[i]);
			putchar('\n');
		}
		putchar('\n');
	}
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值