用了一点群论中的置换群的知识,仅是一点,找出循环节,取模即可。
初次接触群论,等做完余下一点东西后就系统一点学习组合数学的内容
#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]=' '; } 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]=' '; cout<<ans+1<<endl; } cout<<endl; } return 0; }