load "Listsort";
load "String";
fun atfed (n, mit: string, mivel: string) =
if size mit < n then false else
if size mivel < n then false else
if (String.isPrefix (substring(mit,size mit-n, n)) mivel) then true
else false;
fun ellenoriz (_,_,[]) = []
| ellenoriz (n, elem, lista::listatail) =
if atfed(n, elem, lista) then (n,lista)::ellenoriz(n, elem, listatail)
else ellenoriz(n,elem,listatail);
fun levalogat (_,[],_) = []
| levalogat (n,lista::listatail,[]) =
if (size ellenoriz(n,lista,listatail) <> 0 ) then (lista, ellenoriz(n,lista,listatail))::levalogat(n,listatail,[lista])
| levalogat (n,lista::listatail,marad) =
if (size ellenoriz(n,lista,marad)) <> 0 andalso (size ellenoriz(n,lista,listatail) <> 0) then (lista, (ellenoriz(n,lista,marad)))::((lista, ellenoriz(n,lista,listatail)))::(levalogat(n,listatail,[lista]@marad));
fun atfedok n lista = levalogat(n, Listsort.sort String.compare lista,[]);