題目:http://poj.org/problem?id=1026
另:http://acm.hdu.edu.cn/showproblem.php?pid=1439
題解:求出經過k次置換後,str[i]的位置。
代碼:
#include <stdio.h>#include <string.h>int m,n,len,k;char str[205],s[205];int a[205],t[205]; //t記錄i的迴圈長度int v[205];void solve() //求出迴圈長度{ int x=0,k=1,j; for(int i=1;i<=n;i++) { v[i]=0; t[i]=0; } for(int i=1;i<=n;i++) { if(v[i]==0) { v[i]=k; j=a[i]; x=1; while(i!=j) { v[j]=k; x++; j=a[j]; } } t[k]=x; k++; }}int ok(int i) //返回字串str的i處在新的字串的位置{ int m,j,x=0; m=k%t[v[i]]; j=i; while(x<m) { j=a[j]; x++; } return j;}int main(){ // freopen("/home/wk/in.txt","r",stdin); while(1) { scanf("%d",&n); if(n==0) break; memset(a,0,sizeof(a)); for(int i=1;i<=n;i++) scanf("%d",&a[i]); solve(); while(1) { scanf("%d",&k); if(k==0) break; getchar(); gets(str); len=strlen(str); // printf("%d\n",len); if(len<n) { for(int i=len;i<n;i++) str[i]=' '; } // for(int i=n-1;i>=0;i--) // printf("%c",str[i]); // printf("\n"); for(int i=1;i<=n;i++) s[ok(i)-1]=str[i-1]; s[n]='\0'; printf("%s\n",s); } printf("\n"); }}