Haskell Equi Leader
equiLeader :: [Int] -> Int
equiLeader a = length (filter isEqui (zip3 [0 ..] a prefixLeaderCounts))
where
n = length a
(size, value) = foldl step (0, 0) a
step (sz, val) v
| sz == 0 = (1, v)
| val /= v = (sz - 1, val)
| otherwise = (sz + 1, val)
candidate = if size > 0 then value else -1
leaderCount = length (filter (== candidate) a)
leader = if leaderCount > n `div` 2 then candidate else -1
prefixLeaderCounts = scanl1 (+) [if v == leader then 1 else 0 | v <- a]
isEqui (k, _, lLeaderCount) =
let leftHalf = (k + 1) `div` 2
rightHalf = (n - k - 1) `div` 2
rLeaderCount = leaderCount - lLeaderCount
in lLeaderCount > leftHalf && rLeaderCount > rightHalf
This keeps leader counts on both sides of the split and counts positions where the same leader survives in each half.