https://www.interviewstreet.com/challenges/dashboard/#problem/4f802ebfad2a1
私のコードは 6/10 テスト ケースに合格しています。
from collections import Counter
j,k = map(int, raw_input().split())
y = Counter(len(raw_input()) for i in range(j))
saved = {}
def f(x):
if x in saved: return saved[x]
if x<1: return 0
k = y[x] if x in y else 0
for i in y:
k += y[i]*f(x-i)
saved[x] = k
return k
x = 0
for i in xrange(1,k+1):
x+=f(i)
print (x+1)%1000000007
「y」のキーはスーパー ストリングの長さであり、その値はセット「H」でその長さを持つスーパー ストリングの数です。
'saved' はメモ化を処理します。
f(x) は、長さ x のハイパー ストリングを計算します。最後の「for ループ」ですべての値を反復処理します。
x には空の文字列 ('') 以外の結果があるため、x+1