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 }
poj 1026 Cipher,布布扣,bubuko.com
时间: 2024-11-08 17:03:28