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'。
'已保存'处理备忘录。
f(x)计算长度为x的超弦。我遍历了'for loop'中的所有值。
x的结果除了空字符串(''),因此x + 1
答案 0 :(得分:2)
我认为当任何超级字符串是任何其他超级字符串的concat时,此代码会失败。 在这种情况下,此代码将多次添加一些案例。 例如:
3 2
a
b
ab
你的输出:8
正确输出:7
双重计算“ab”
我自己在尝试这个问题,如果得分为10/10则会发布答案
答案 1 :(得分:1)
好的,这是我的代码。我已经使用您的代码作为算法,但删除了可以通过串联其他超级字符串形成的超级字符串。 感谢您发布您的问题,我看到这篇文章之前的原始代码非常不理想。 任何进一步优化这一点的建议都是值得欢迎的。
from collections import Counter
j,k = map(int, raw_input().split())
supers_list = []
for i in range(j):
supers_list.append(raw_input())
def check_concat(Str_, Sub_Str_):
if Sub_Str_ == "":
return False
for i in supers_list:
if i == Sub_Str_ and Str_ != Sub_Str_:
return True
x = Sub_Str_.startswith(i)
if x == True:
if check_concat(Str_, Sub_Str_[len(i):]) == True:
return True
return False
def filter_():
tmp = []
global supers_list
for i in supers_list:
if check_concat(i,i) == False:
tmp.append(i)
supers_list = tmp
filter_()
y = Counter(len(i) for i in supers_list)
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