Advertisement
Guest User

Untitled

a guest
Feb 25th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.45 KB | None | 0 0
  1. {-# LANGUAGE FlexibleInstances, UndecidableInstances, DuplicateRecordFields #-}
  2.  
  3. module Main where
  4.  
  5. import Control.Monad
  6. import Data.List
  7. import Data.List.Split
  8. import Data.Map (Map)
  9. import qualified Data.Map as Map
  10. import System.Environment
  11. import System.IO
  12.  
  13.  
  14. -- Complete the function below.
  15.  
  16. maximumPermutation w s =
  17. let l = length w
  18. j = fromIntegral l :: Integer
  19. h = hash j w 0
  20. g = hash j (take l s) 0
  21. k = otherHash (take l s) 0
  22. m = findPerms s (drop l s) j h g k Map.empty
  23. r = getMaxFromMap m
  24. in fromKey j "" $ headOr r (-1)
  25.  
  26. fromKey :: Integer -> String -> Integer -> String
  27. fromKey _ _ (-1) = "-1"
  28. fromKey 0 s _ = s
  29. fromKey j s x = fromKey (j-1) (c:s) (div x 26)
  30. where c = toEnum $ fromIntegral ((mod x 26) + 97)
  31.  
  32. hash :: Integer -> [Integer] -> Integer -> Integer
  33. hash _ [] h = h
  34. hash l (x:xs) h = hash l xs (h + (l ^ x))
  35.  
  36. updtHash :: Integer -> Integer -> Integer -> Integer -> Integer
  37. updtHash l h x y = h + (l ^ y) - (l ^ x)
  38.  
  39. otherHash :: [Integer] -> Integer -> Integer
  40. otherHash [] h = h
  41. otherHash (x:xs) h = otherHash xs ((26 * h) + x)
  42.  
  43. updtOthrHash :: Integer -> Integer -> Integer -> Integer -> Integer
  44. updtOthrHash l h x y = (26 * (h - ((26 ^ (l-1)) * x))) + y
  45.  
  46. findPerms :: [Integer] -> [Integer] -> Integer -> Integer -> Integer -> Integer -> Map Integer Integer -> Map Integer Integer
  47. findPerms [] _ _ _ _ _ m = m
  48. findPerms _ [] _ _ _ _ m = m
  49. findPerms (x:xs) (y:ys) l h g k m
  50. | h == g = findPerms xs ys l h (updtHash l g x y) (updtOthrHash l k x y) (Map.insertWith (+) k 1 m)
  51. | otherwise = findPerms xs ys l h (updtHash l g x y) (updtOthrHash l k x y) m
  52.  
  53. headOr [] x = x
  54. headOr (x:_) _ = x
  55.  
  56. getMaxFromMap m = go [] Nothing (Map.toDescList m)
  57. where
  58. go ks _ [] = ks
  59. go ks Nothing ((k,v):rest) = go (k:ks) (Just v) rest
  60. go ks (Just u) ((k,v):rest)
  61. | v < u = go ks (Just u) rest
  62. | v > u = go [k] (Just v) rest
  63. | otherwise = go (k:ks) (Just v) rest
  64.  
  65.  
  66. main :: IO()
  67. main = do
  68. fileName <- getEnv "OUTPUT_PATH"
  69. out <- openFile fileName WriteMode
  70.  
  71. t <- readLn :: IO Int
  72.  
  73. forM_ [1..t] $ \tItr -> do
  74. w <- getLine
  75.  
  76. s <- getLine
  77.  
  78. let result = maximumPermutation (toIs w) (toIs s)
  79.  
  80. hPutStrLn out result
  81.  
  82. hFlush out
  83. hClose out
  84.  
  85. toIs :: [Char] -> [Integer]
  86. toIs xs = map ( (subtract 97) . fromIntegral . fromEnum ) xs
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement