!7 static L verbs = toLinesFullTrim([[ kow towed made started want ]]); sclass StringTree { bool ok; new HashMap children; StringTree getOrAdd(S s) { StringTree t = children.get(s); if (t == null) children.put(s, t = new StringTree); ret t; } } static new StringTree tree; p { tree = multiWordMap_lower(verbs); testAnswerFunction([[ he kow towed before them i want stuff kow towed I WANT YOU ]]); botSleep(); } static L parse(S s) { ret codeTokens(nlTok4(lower(s))); } static StringTree multiWordMap_lower(L items) { new StringTree tree; for (S s : items) { L tok = parse(s); addToTree(tree, tok); } ret tree; } svoid addToTree(StringTree tree, L tok) { if (empty(tok)) { tree.ok = true; ret; } S s = first(tok); StringTree t = tree.getOrAdd(s); addToTree(t, dropFirst(tok)); } sS answer(S s) { L tok = parse(s); new L verbs; for i over tok: { StringTree tree = main.tree; int j = i; while (tree != null && j < l(tok)) { if (tree.ok) verbs.add(joinWithSpace(subList(tok, i, j))); tree = tree.children.get(tok.get(j)); ++j; } } ret join(", ", verbs); }