usaco 3.14 contact

usaco 3.14 contact
垃圾代码,真不想贴代码啊!
Compiling...
Compile: OK

Executing...
Test 1: TEST OK [0.011 secs, 8236 KB]
Test 2: TEST OK [0.000 secs, 8240 KB]
Test 3: TEST OK [0.238 secs, 8240 KB]
Test 4: TEST OK [0.011 secs, 8240 KB]
Test 5: TEST OK [0.259 secs, 8240 KB]
Test 6: TEST OK [0.022 secs, 8240 KB]
Test 7: TEST OK [0.313 secs, 8240 KB]
非常慢么!
  1   // 三进制存储
  2  // 可以用二维数组 F[i,j]表示值为i位数为j的信号出现次数
  3  // 也可以在二进制前+1,这样会很大程度上节省空间
  4  // 标程用了牛逼的位运算,我还是先不用了吧
  5  // 这题是是联想到了dijstra+heap 的hash数组的用法联想出来的
  6  // 但是要注意sort的应用,排序其实都还是随机的,按照此题的cmp方法,顺序也是随机的
  7  #include < iostream >
  8  #include < fstream >
  9  #include < cmath >
 10  using   namespace  std;
 11  ifstream fin( " contact.in " );
 12  ofstream fout( " contact.out " );
 13  int  num[ 200005 ];
 14  int  cat[ 540000 ];
 15  int  hash[ 540000 ]; // 记录位置而已
 16  int  a,b,n;
 17  int  ans[ 12 ];
 18  int  cons[ 100000 ];
 19  int  trans( int  i, int  a)
 20  {
 21         int  tmp = 0 ;
 22         for ( int  j = i;j < i + a; ++ j)
 23              tmp = tmp * 3 + num[j];
 24         return  tmp;
 25  }
 26  bool  cmp1( int  a, int  b)
 27  {
 28         return  cat[a] > cat[b];
 29  }
 30  bool  cmp2( int  a, int  b)
 31  {
 32         return  a < b;
 33  }
 34  void  cal( int  a)
 35  {
 36         int  cnt = 0 ;
 37         while (a)
 38        {
 39              ans[cnt ++ ] = a % 3 - 1 ;
 40              a /= 3 ;
 41        }
 42         for ( int  i = cnt - 1 ;i >= 0 ; -- i)
 43              fout << ans[i];
 44  }
 45  int  main()
 46  {
 47         int  tmp;
 48         char  c;
 49        fin >> a >> b >> n;
 50        fin. get ();
 51         int  cnt = 0 ;
 52         for ( int  i = 0 ;i < ( int )pow( 3.0 ,( double )b); ++ i)
 53        {
 54              cat[i] = 0 ;
 55              hash[i] = i;
 56        }
 57         while ( 1 )
 58        {
 59               if (fin.eof()) break ;
 60              c = fin. get (); // 读入的时候是当做字符,所以c的值为它的ascii码值
 61               if (c == ' \n ' ) continue ;
 62              num[cnt ++ ] = c - ' 0 ' + 1 ;
 63        }
 64         for ( int  i = 0 ;i < cnt; ++ i)
 65        {
 66               if (i + a > cnt) break ;
 67              tmp = trans(i,a);
 68              cat[tmp] ++ ;
 69               for ( int  j = a + 1 ;j <= b; ++ j)
 70              {
 71                     if (i + j >= cnt) break ;
 72                    tmp = tmp * 3 + num[i + j - 1 ];
 73                    cat[tmp] ++ ;
 74              }
 75        }
 76        sort(hash,hash + ( int )pow( 3.0 ,( double )b),cmp);
 77         int  cas = 0 ;
 78         int  sum = 0 ;
 79         int  z;
 80         while ( 1 )
 81        {
 82              z = 0 ;
 83              sum ++ ;
 84               if (sum > n) break ;
 85               if (cat[hash[cas]] == 0 ) break ;
 86               if (hash[cas] == 0 ) break ;
 87              fout << cat[hash[cas]] << endl;
 88              cons[z ++ ] = hash[cas ++ ];
 89               while (cat[hash[cas]] == cat[hash[cas - 1 ]])
 90              {
 91                    cons[z ++ ] = hash[cas];
 92                    cas ++ ;
 93              }
 94              sort(cons,cons + z,cmp2);
 95              cal(cons[ 0 ]);
 96               for ( int  i = 1 ;i < z; ++ i)
 97              {
 98                     if (i % 6 == 0 )
 99                    {
100                          fout << endl;
101                          cal(cons[i]);
102                           continue ;
103                    }
104                    fout << "   " ;
105                    cal(cons[i]);
106              }
107              fout << endl;
108        }
109         return   0 ;
110  }



你可能感兴趣的:(usaco 3.14 contact)