from __future__ import with_statementimport sysimport readlinedef powerset(L): return ((L[j] for j in xrange(len(L)) if (1<<j) & i) for i in xrange(2 ** len(L)))# Generate dictionary (probably ought to read from stdin...)d = {}with open(sys.argv[1]) as f: for word in f: word = word.strip() key = tuple(sorted(word)) if key in d: d[key].append(word) else: d[key] = [word]try: while True: words = [] letters = raw_input('> ') letters = filter(str.isalpha, letters.upper()) for p in powerset(letters): key = tuple(sorted(p)) words += d.get(key, []) words.sort(key=len) longest = len(words[-1]) # Only display the longest and next-to-longest words for word in words: if len(word) >= longest - 1: print word.lower()except (EOFError, KeyboardInterrupt): pass