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 }

 

posted @ 2012-10-18 15:24  Naix_x  阅读(156)  评论(0编辑  收藏  举报