开博 && SPOJ 21

开博 && SPOJ 21

再次介绍我自己,OI界摸爬滚打5年半的老菜鸟,ACM/ICPC摸爬滚打半年的09级新人……
为啥转移到了javablog呢?
今后争取把主语言转为java……
不过这里的代码不见得都是java,毕竟ICPC题,java的IO还是很吃亏的,TC争取都java……

今天写计算机科学概论论文,顺道写了个题:SPOJ 21

    给出n条记录(n<=100000),形如 03 10103538 2222 1233 6160 0142
    要求将它们按字典序排序,并且统计每组记录的出现次数
    例如:
    6
    03 10103538 2222 1233 6160 0142
    03 10103538 2222 1233 6160 0141
    30 10103538 2222 1233 6160 0141
    30 10103538 2222 1233 6160 0142
    30 10103538 2222 1233 6160 0141
    30 10103538 2222 1233 6160 0142
    输出:
    03 10103538 2222 1233 6160 0141 1
    03 10103538 2222 1233 6160 0142 1
    30 10103538 2222 1233 6160 0141 2
    30 10103538 2222 1233 6160 0142 2

算法:10000为基的基数排序+10000的计数排序

复杂度O(N)

  1  #include  < cstdio >
  2  #include  < cstring >
  3 
  4  inline  int  nextInt()
  5  {
  6       int  ans = 0 ;
  7       for  (;;)
  8      {
  9           char  c = getchar();
 10           if  (c < ' 0 ' || c > ' 9 ' )
 11               break ;
 12          ans = (ans << 3 ) + (ans << 1 ) + c - ' 0 ' ;
 13      }
 14       return  ans;
 15  }
 16 
 17  struct  node
 18  {
 19       int  key[ 7 ];
 20  };
 21  bool   operator   == (node a,node b)
 22  {
 23       for  ( int  i = 0 ;i < 7 ;i ++ )
 24           if  (a.key[i] != b.key[i])
 25               return   0 ;
 26       return   1 ;
 27  }
 28 
 29  inline  void  nextNode(node  & ans)
 30  {
 31      ans.key[ 0 ] = nextInt();
 32       int  tmp = 0 ;
 33       for  ( int  i = 0 ;i < 4 ;i ++ )
 34      {
 35           char  c = getchar();
 36          tmp = (tmp << 3 ) + (tmp << 1 ) + c - ' 0 ' ;
 37      }
 38      ans.key[ 1 ] = tmp;
 39       for  ( int  i = 2 ;i < 7 ;i ++ )
 40          ans.key[i] = nextInt();
 41      getchar();
 42  }
 43 
 44  node arr[ 100010 ];
 45 
 46  int  cnt[ 10010 ];
 47  int  n;
 48  int  arr1[ 100010 ];
 49  int  arr2[ 100010 ];
 50  int   * now;
 51  int   * sorted;
 52 
 53  int  KEY[ 100010 ];
 54 
 55  void  mysort( int  s)
 56  {
 57      memset(cnt, 0 , sizeof (cnt));
 58       for  ( int  i = 0 ;i < n;i ++ )
 59          KEY[i] = arr[now[i]].key[s];
 60       for  ( int  i = 0 ;i < n;i ++ )
 61          cnt[KEY[i]] ++ ;
 62       for  ( int  i = 1 ;i <= 10000 ;i ++ )
 63          cnt[i] += cnt[i - 1 ];
 64       for  ( int  i = n - 1 ;i >= 0 ;i -- )
 65          sorted[ -- cnt[KEY[i]]] = now[i];
 66  }
 67 
 68  void  printNode(node a)
 69  {
 70      printf( " %02d  " ,a.key[ 0 ]);
 71      printf( " %04d%04d " ,a.key[ 1 ],a.key[ 2 ]);
 72       for  ( int  i = 3 ;i < 7 ;i ++ )
 73          printf( "  %04d " ,a.key[i]);
 74  }
 75 
 76  int  main()
 77  {
 78       int  nn = nextInt();
 79       while  (nn -- )
 80      {
 81          n = nextInt();
 82          now = arr1;
 83          sorted = arr2;
 84           for  ( int  i = 0 ;i < n;i ++ )
 85          {
 86              nextNode(arr[i]);
 87              now[i] = i;
 88          }       
 89           for  ( int  i = 6 ;i >= 0 ;i -- )
 90          {
 91              mysort(i);
 92               int   * tmp = now;
 93              now = sorted;
 94              sorted = tmp;
 95          }
 96           for  ( int  i = 0 ,j = i;i < n;i = j)
 97          {
 98              node Now = arr[now[i]];
 99               int  cnt = 0 ;
100               for  (;Now == arr[now[j]];j ++ ,cnt ++ );
101              printNode(arr[now[i]]);
102              printf( "  %d\n " ,cnt);
103          }
104           if  (nn) putchar( 10 );
105          getchar();
106      }
107       return   0 ;
108  }


你可能感兴趣的:(开博 && SPOJ 21)