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 }

 

你可能感兴趣的:(poj)