Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- import sys
- from multiprocessing import Pool
- def time_function(func):
- def wrapped_func(*args, **kwargs):
- from time import time
- start = time()
- sys.stderr.write('Function %s started\n' % (func.__name__,))
- res = func(*args, **kwargs)
- sys.stderr.write('Function %s finished in %.6fs\n' % (func.__name__, time() - start))
- return res
- return wrapped_func
- class Problem(object):
- def __init__(self, data):
- self.length, self.seq = data
- self.length = int(self.length)
- self.seq = list(self.seq)
- def checksum(self, arr):
- result = 1
- for i in range(len(arr)):
- result = (31 * result + arr[i]) % 1000003
- return result
- def reversed_merge_sort(self, arr):
- n = len(arr)
- if n <= 1:
- return arr
- mid = n / 2
- first_half = self.reversed_merge_sort(arr[:mid])
- second_half = self.reversed_merge_sort(arr[mid:])
- return self.merge(first_half, second_half)
- def merge(self, arr1, arr2):
- result = []
- while len(arr1) > 0 and len(arr2) > 0:
- s = self.seq.pop(0)
- if s == '1':
- result.append(arr1.pop(0))
- else:
- result.append(arr2.pop(0))
- result += arr1
- result += arr2
- return result
- @time_function
- def get_solution(self):
- result = [0] * self.length
- for i, res in enumerate(self.reversed_merge_sort(range(self.length))):
- result[res] = i + 1
- return self.checksum(result)
- @time_function
- def main():
- input_file = open('input.txt')
- data = input_file.read().split()
- n = int(data.pop(0))
- results = {}
- pool = Pool()
- for i in range(1, n + 1):
- args = data.pop(0), data.pop(0)
- results[i] = pool.apply_async(Problem(args).get_solution)
- pool.close()
- pool.join()
- for i in sorted(results):
- print "Case #%d: %s" % (i, results[i].get())
- if __name__ == '__main__':
- from doctest import testmod
- print >> sys.stderr, testmod()
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement