POJ 1026
用了一点群论中的置换群的知识,仅是一点,找出循环节,取模即可。
初次接触群论,等做完余下一点东西后就系统一点学习组合数学的内容
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
int chan[210];
int partic[210],np;
bool vis[210];
char s[210];
char ans[210];
int main(){
int k;
while(scanf("%d",&n),n){
for(int i=1;i<=n;i++)
scanf("%d",&chan[i]);
while(scanf("%d",&k),k){
getchar();
gets(s+1);
memset(vis,false,sizeof(vis));
if(strlen(s+1)<n){
for(int i=strlen(s+1)+1;i<=n;i++)
s[i]=' ';
s[n+1]='\0';
}
for(int i=1;i<=n;i++){
np=0;
if(!vis[i]){
while(!vis[i]){
vis[i]=true;
partic[np++]=i;
i=chan[i];
}
for(int p=0;p<np;p++){
ans[partic[(p+k)%np]]=s[partic[p]];
}
}
}
ans[n+1]='\0';
cout<<ans+1<<endl;
}
cout<<endl;
}
return 0;
}

浙公网安备 33010602011771号