POJ 1026 Cipher(置换群)
以前做过置换群的题目,基本上都是一个样,这个题,数据不大,乱搞即可,注意换行,贡献一次PE。
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 using namespace std; 5 int p[501],o[501],z; 6 void dfs(int i) 7 { 8 if(!o[i]) 9 { 10 o[i] = 1; 11 z ++; 12 dfs(p[i]); 13 o[i] = z; 14 } 15 else 16 { 17 return ; 18 } 19 } 20 int main() 21 { 22 int i,n,m,num,temp,len; 23 char s1[301],s2[301]; 24 while(scanf("%d",&n)!=EOF) 25 { 26 if(n == 0) break; 27 memset(o,0,sizeof(o)); 28 for(i = 1; i <= n; i ++) 29 { 30 scanf("%d",&p[i]); 31 } 32 for(i = 1;i <= n;i ++) 33 { 34 z = 0; 35 if(!o[i]) 36 dfs(p[i]); 37 } 38 for(;;) 39 { 40 scanf("%d%*c",&m); 41 if(m == 0) break; 42 gets(s1); 43 len = strlen(s1); 44 for(i = len;i <= n-1;i ++) 45 { 46 s1[i] = ' '; 47 } 48 for(i = 0;i <= n-1;i ++) 49 { 50 num = m%o[i+1]; 51 temp = i+1; 52 while(num != 0) 53 { 54 temp = p[temp]; 55 num --; 56 } 57 s2[temp-1] = s1[i]; 58 } 59 s2[n] = '\0'; 60 printf("%s\n",s2); 61 } 62 printf("\n"); 63 } 64 return 0; 65 }