Advertisement
MrHaas

Recover the sequence

Jan 30th, 2012
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.24 KB | None | 0 0
  1. #!/usr/bin/env python
  2. import sys
  3. from multiprocessing import Pool
  4.  
  5. def time_function(func):    
  6.     def wrapped_func(*args, **kwargs):
  7.         from time import time
  8.         start = time()
  9.         sys.stderr.write('Function %s started\n' % (func.__name__,))
  10.         res = func(*args, **kwargs)
  11.         sys.stderr.write('Function %s finished in %.6fs\n' % (func.__name__, time() - start))
  12.         return res
  13.     return wrapped_func
  14.  
  15. class Problem(object):
  16.     def __init__(self, data):
  17.         self.length, self.seq = data
  18.         self.length = int(self.length)
  19.         self.seq = list(self.seq)
  20.    
  21.     def checksum(self, arr):
  22.         result = 1
  23.         for i in range(len(arr)):
  24.             result = (31 * result + arr[i]) % 1000003
  25.         return result
  26.  
  27.     def reversed_merge_sort(self, arr):
  28.         n = len(arr)
  29.         if n <= 1:
  30.             return arr
  31.        
  32.         mid = n / 2
  33.         first_half = self.reversed_merge_sort(arr[:mid])
  34.         second_half = self.reversed_merge_sort(arr[mid:])
  35.         return self.merge(first_half, second_half)
  36.    
  37.     def merge(self, arr1, arr2):
  38.         result = []
  39.         while len(arr1) > 0 and len(arr2) > 0:
  40.             s = self.seq.pop(0)
  41.             if s == '1':
  42.                 result.append(arr1.pop(0))
  43.             else:
  44.                 result.append(arr2.pop(0))
  45.         result += arr1
  46.         result += arr2
  47.         return result
  48.                
  49.     @time_function
  50.     def get_solution(self):
  51.         result = [0] * self.length
  52.         for i, res in enumerate(self.reversed_merge_sort(range(self.length))):
  53.             result[res] = i + 1        
  54.         return self.checksum(result)                            
  55.        
  56.  
  57. @time_function
  58. def main():
  59.     input_file = open('input.txt')
  60.     data = input_file.read().split()    
  61.     n = int(data.pop(0))
  62.     results = {}
  63.     pool = Pool()
  64.     for i in range(1, n + 1):
  65.         args = data.pop(0), data.pop(0)
  66.         results[i] = pool.apply_async(Problem(args).get_solution)
  67.     pool.close()
  68.     pool.join()
  69.    
  70.     for i in sorted(results):
  71.         print "Case #%d: %s" % (i, results[i].get())  
  72.    
  73. if __name__ == '__main__':
  74.     from doctest import testmod
  75.     print >> sys.stderr, testmod()
  76.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement