poj 1026 Cipher

这是一道置换题目,我们只要找出每个置换循环的循环节就可以了,对K进行取模,在进行模拟就OK了;

代码1:

View Code
#include<iostream>
  #include<cstdio>
  #include<cstdlib>
  #include<algorithm>
  #include<cmath>
  #include<queue>
  #include<set>
  #include<map>
  #include<cstring>
  #include<vector>
  #include<string>
  #define LL long long
  using namespace std;
  class Node
  {
  public:
        int num[224];
        int cnt;    
  }cir[224];
  class Number
  {
  public:
        int place,num;    
  }number[224];
  int Gcd( int a, int b )
  {
      return b == 0 ? a : Gcd( b , a % b );    
  }
  int Get_circle( int n )
  {
      bool visit[224] = {0};
      int cnt = 0;
      for( int i = 1 ; i <= n ; i ++ )
      {
           if( !visit[i] )
           {    
               int t = number[i].num;
               cir[cnt].cnt = 0;            
               visit[i] = true;
                while( t != i )
                {
                 visit[t] = true;
                 cir[cnt].num[cir[cnt].cnt++] = t;
                 t = number[t].num;    //puts( "asf" );    
               } 
               cir[cnt].num[cir[cnt].cnt++] = i;
               cnt++;        
           }    
      }    
      return cnt;
  }
  int main(  )
  {
      int n,k;
      char str[224],c[224];
      while( scanf( "%d",&n ),n )
      {
           for( int i =1 ; i <= n ; i ++ )
           {
                scanf( "%d",&number[i].num );    
                number[i].place = i;    
           }
           int cnt = Get_circle( n );
           while( scanf( "%d",&k ),k )    
           {
               memset( str , 0 , sizeof( str ) );
               gets( str );
               int L = strlen( str );
              for( int i = L ; i <= n ; i ++ )
                   str[i] = ' ';
               str[n+1] = '\0';
               for( int i = 0 ; i < cnt ; i ++ )
               {
                    int t = k % cir[i].cnt;
                    for( int j = 0; j < cir[i].cnt ; j ++ )
                    {
                         int place = (j+ t)%cir[i].cnt;
                         c[cir[i].num[place]] = str[cir[i].num[j]];
                    }    
               }
               c[n+1] = '\0';
               puts( c + 1 );
           }
           puts( "" );
      }   
      //system( "pause" );
      return 0;
  }
 

 

 

代码2:

View Code
#include<iostream>
 #include<cstdio>
 #include<cstdlib>
 #include<algorithm>
 #include<cmath>
 #include<queue>
 #include<set>
 #include<map>
 #include<cstring>
 #include<vector>
 #include<string>
 #define LL long long
 using namespace std;
 
 void Get_circle( int n,int num[] ,int len[] )
 {
     int cnt = 0;
     for( int i = 1 ; i <= n ; i ++ )
     {
          cnt = 1;
          int t = num[i];
           while( t != i )
           {
             cnt ++;
            t = num[t];        
          } 
          len[i] = cnt;
     }    
 }
 int main(  )
 {
     int n,k,num[224],len[224];
     char str[224],c[224];
     while( scanf( "%d",&n ),n )
     {
          for( int i =1 ; i <= n ; i ++ )
          {
               scanf( "%d",&num[i] );    
          }
          Get_circle( n ,num ,len );
          while( scanf( "%d",&k ),k )    
          {
              memset( str , 0 , sizeof( str ) );
              gets( str );
              int L = strlen( str );
              for( int i = L ; i <= n ; i ++ )
                   str[i] = ' ';
               str[n+1] = '\0';
              int sum = 0;
              for( int i = 1 ; i <= n ; i ++ )
              {                 
                   int t = k % len[i],tt=i;
                   while( t-- )
                   {
                       tt = num[tt]; 
                   }
                  c[tt] = str[i]; 
              }
              c[n+1] = '\0';
              puts( c + 1 );
          }
          puts( "" );
     }   
     //system( "pause" );
     return 0;
 }
 
posted @ 2012-09-12 21:09  wutaoKeen  阅读(152)  评论(0编辑  收藏  举报