#Japt, 50 40 34 28 bytes
Japt, 50 40 34 28 bytes
V²o ®s1+Ul)£UgXnH)¯X¦0}Ãâ ¯V
Input is "string", number of items. Output is sorted by length, then reverse alphabet order. Test it online!
How it works
V² o ® s1+Ul)£ UgXnH)¯ X¦ 0}Ã â ¯ V
Vp2 o mZ{Zs1+Ul)mX{UgXnH)s0,X!=0}} â s0,V
Vp2 o // Create the range [0..V²).
mZ{ } // Map each item Z in this range to:
Zs1+Ul) // Take the base-(1+U.length) representation of Z.
mX{ } // Map each char X in this to:
XnH // Parse X as a base-32 number.
Ug ) // Take the char at index -^ in U.
s0,X!=0 // If X is 0, slice it to an empty string.
â // Uniquify the result.
s0,V // Slice to the first V items.
This version takes a while if you want to do any more than 100 items. If you want a faster version, try this 32-byte one:
V*2 o ms1+Ul)f@!Xf'0î£UgXnH}ïV