首页 > 代码库 > poj 1026 Cipher

poj 1026 Cipher

http://poj.org/problem?id=1026

这道题题意是给你一个置换群,再给你一个字符串,输出经过k次置换的字符串。 就是找循环节。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define maxn 3000
 5 using namespace std;
 6 
 7 int a[maxn],key[maxn];
 8 int n,k;
 9 char str[maxn],ans[maxn];
10 void get_key()
11 {
12     for(int i=1; i<=n; i++)
13     {
14         int t1=1;
15         int id=a[i];
16         while(id!=i)
17         {
18             id=a[id];
19             t1++;
20         }
21         key[i]=t1;
22     }
23 }
24 
25 int main()
26 {
27     while(scanf("%d",&n)!=EOF)
28     {
29         if(n==0) break;
30         memset(a,0,sizeof(a));
31         memset(key,0,sizeof(key));
32         for(int i=1; i<=n; i++)
33         {
34             scanf("%d",&a[i]);
35         }
36         get_key();
37         while(scanf("%d",&k)!=EOF)
38         {
39             if(k==0) break;
40             getchar();
41             gets(str+1);
42             int len=strlen(str+1);
43             for(int i=len+1; i<=n; i++) str[i]= ;
44             str[n+1]=\0;
45             for(int i=1; i<=n; i++)
46             {
47                 int id1=i;
48                 for(int j=0; j<k%key[i]; j++)
49                 {
50                     id1=a[id1];
51                 }
52                 ans[id1]=str[i];
53             }
54             ans[n+1]=\0;
55             for(int i=1; i<=n; i++)
56             {
57                 printf("%c",ans[i]);
58             }
59             printf("\n");
60         }
61         printf("\n");
62     }
63     return 0;
64 }
View Code