Guest User

Untitled

a guest
Nov 17th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.89 KB | None | 0 0
  1. # This code is in public domain.
  2. # Written by Andrew Shulayev, 2012
  3.  
  4. # Implementation of Karp-Miller-Rosenberg algorithm
  5. # Builds suffix array of a string with length n
  6. # in O(n log^2 n) time
  7.  
  8. def count_classes(arr, key = lambda x : x):
  9. result = []
  10. for i, x in enumerate(arr):
  11. if i == 0:
  12. result.append(0)
  13. continue
  14. next = result[-1]
  15. if key(arr[i - 1]) != key(x):
  16. next += 1
  17. result.append(next)
  18. return result
  19.  
  20. def suffix_array(string):
  21. n = len(string)
  22. result = range(n)
  23.  
  24. key_string = lambda x : string[x]
  25. result.sort(key = key_string)
  26. classes = count_classes(result, key = key_string)
  27.  
  28. k = 1
  29. while k < n:
  30. tuples = [(classes[i], classes[(i + k) % n], x) for i, x in enumerate(result)]
  31. tuples.sort()
  32. classes = count_classes(tuples, key = lambda t : t[:2])
  33. result = [t[2] for t in tuples]
  34. k *= 2
  35. return result
  36.  
  37. print suffix_array('abacaba$')
Add Comment
Please, Sign In to add comment