Primero haz la observación de que cada nuevo par de letras permite duplicar el número de combinaciones.
Se puede escribir como una optimización lineal por mínimos cuadrados.
min Hago \bf M innecesariamente grande para que el patrón sea más fácil de detectar: {\bf M} = \left[\begin{array}{rrrrrrrrrrrrrrrrrrr} 0&2&0&-1&0&0&0&0&0&0&0&0&0\\ 0&0&0&2&0&-1&0&0&0&0&0&0&0\\ 0&0&0&0&0&2&0&-1&0&0&0&0&0\\ 0&0&0&0&0&0&0&2&0&-1&0&0&0\\ 0&0&0&0&0&0&0&0&0&2&0&-1&0 \end{array}\right]
Pero también necesitamos imponer una condición de contorno: por ejemplo que haya 2 soluciones de 2 letras. Podemos hacerlo añadiendo un término
+\epsilon {\bf C}\|{\bf v}-[0,2,0,\cdots]^T\|_2^2
Donde \bf C es la matriz diagonal 0 en todas partes excepto en {\bf C}_{22} = 1 . Esto forzará la segunda posición de \bf v para ser 2.
Ahora la respuesta real sería sumar el vector solución ya que queremos la suma de todas las combinaciones de longitudes 1,2,3,4,5. Pero eso se hace fácilmente cuando hemos resuelto el sistema.
EDIT: Variaciones Si, por ejemplo, tuviéramos (a|b)+ tendríamos:
{\bf M} = \left[\begin{array}{rrrrrrrrrrrrrrrrrrr} 2&-1&0&0&0&0&0\\ 0&2&-1&0&0&0&0\\ 0&0&2&-1&0&0&0\\ 0&0&0&2&-1&0&0\\ 0&0&0&0&2&-1&0 \end{array}\right]
Porque entonces cada La nueva letra puede tomar cualquiera de los 2 nuevos valores. No es necesario saltar sobre cada segunda letra con un "0" en el sistema de ecuaciones que habría sido forzado a ser "c" en la expresión anterior.
Si tuviéramos ((a|b|c)d)+ tendríamos:
{\bf M} = \left[\begin{array}{rrrrrrrrrrrrrrrrrrr} 0&3&0&-1&0&0&0&0&0&0&0&0&0\\ 0&0&0&3&0&-1&0&0&0&0&0&0&0\\ 0&0&0&0&0&3&0&-1&0&0&0&0&0\\ 0&0&0&0&0&0&0&3&0&-1&0&0&0\\ 0&0&0&0&0&0&0&0&0&3&0&-1&0 \end{array}\right]
Porque habría 3 nuevos casos para multiplicar por cada nueva ocurrencia de ((a|b|c)d)