I'm trying to solve the String Function Calculation problem from Hackerrank. In this problem, we're given a string as input and asked to print a number that represents the maximum of the following function, among all substrings of the input string:
f(s, t) = number of times the substring 's' appears in string 't' * length of substring 's'
I submitted the following as an answer:
import Data.List
main :: IO()
main = do
stringInput <- getLine
print $ solution stringInput
solution :: String -> Int
solution input = maximum $ map sum $ map (map length) $ group $ sort $ substrings input
substrings :: String -> [String]
substrings s = tail . inits =<< tails s
The idea was to:
Get all substrings of
s
.let s = "aaaaaa"; substrings s = ["a","aa","aaa","aaaa","aaaaa","aaaaaa","a","aa","aaa","aaaa","aaaaa","a","aa","aaa","aaaa","a","aa","aaa","a","aa","a"]
Sort it.
["a","a","a","a","a","a","aa","aa","aa","aa","aa","aaa","aaa","aaa","aaa","aaaa" ,"aaaa","aaaa","aaaaa","aaaaa","aaaaaa"]
Group it.
[["a","a","a","a","a","a"],["aa","aa","aa","aa","aa"],["aaa","aaa","aaa","aaa"],["aaaa","aaaa","aaaa"],["aaaaa","aaaaa"],["aaaaaa"]]
Get the individual lengths of each substring.
[[1,1,1,1,1,1],[2,2,2,2,2],[3,3,3,3],[4,4,4],[5,5],[6]]
Sum the resulting lists.
[6,10,12,12,10,6]
.Get the maximum.
12
.
This passes the preliminary tests. However, when I submit it it fails all other tests, by 'Runtime Error'.
Test case no. 2, the first to fail, takes 1.47 seconds to run and has the following input:
"aacbbabbabbbbbaaaaaaabbbbcacacbcabaccaabbbcaaabbccccbbbcbccccbbcaabaaabcbaacbcbaccaaaccbccbcaacbaccbaacbbabbabbbbbaaaaaaabbbbcacacbcabaccaabbbcaaabbccccbbbcbccccbbcaabaaabcbaacbcbaccaaaccbccbcaacbaccbaacbbabbabbbbbaaaaaaabbbbcacacbcabaccaabbbcaaabbccccbbbcbccccbbcaabaaabcbaacbcbaccaaaccbccbcaacbaccbaacbbabbabbbbbaaaaaaabbbbcacacbcabaccaabbbcaaabbccccbbbcbccccbbcaabaaabcbaacbcbaccaaaccbccbcaacbaccbaacbbabbabbbbbaaaaaaabbbbcacacbcabaccaabbbcaaabbccccbbbcbccccbbcaabaaabcbaacbcbaccaaaccbccbcaacbaccb"
Could you help me figure out what I'm doing wrong, or what's going on?