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

 

你可能感兴趣的:(poj)