let getHashSet k (lstr:string) =
let strs = Collections.Generic.HashSet<string>()
for i in 0..lstr.Length - k do
strs.Add lstr.[i..i + k - 1] |> ignore
let strss = lstrs |> Seq.map (getHashSet k) |> Seq.sortBy (fun strs -> strs.Count)
let rest = strss |> Seq.skip 1 |> Seq.toArray
[| for s in Seq.head strss do
if rest |> Array.forall (fun strs -> strs.Contains s) then yield s
let random = System.Random System.DateTime.Now.Millisecond
yield random.Next 20 |> (+) 65 |> System.Convert.ToByte
|] |> System.Text.Encoding.ASCII.GetString
[ for i in 1..3 do yield generateString 10000 ]
|> fun l -> printfn "found %d\n %A" l.Length l