Форум » Обработка символьных строк » 6610 не сходится ответ » Ответить

6610 не сходится ответ

Степан Балаян: Здравствуйте! Решаю задачу 6610, получается ответ больше, чем указанный. Очень прошу помочь найти ошибку. [pre2] f = open('input.txt') s = f.readline() arr = s.split('SOLO') # blocks without 'SOLO' sets = [set(arr[ i]) for i in range(len(arr))] # unique elements of blocks ans = 0 l = 0 r = 0 # ans looks like # ...S[OLO___SOLO___SOLO___SOLO___SOLO___SOL]O... # if leftmost and rightmost 'SOLO's exist for i in range(len(arr) - 4): # check that there are at least 5 different digits in these blocks set_union = set() for j in range(i, i + 5): set_union = set_union.union(sets[j]) cnt_digits = 0 for i in range(10): if chr(ord('0') + i) in set_union: cnt_digits += 1 cur = 0 if cnt_digits >= 5: for j in range(i, i + 5): cur += len(arr[ i]) cur += (4 * 4) # add lengths of 'SOLO's cur += 3 + 3 # and those edges ('OLO' and 'SOL') if i == 0 or i + 4 == len(arr) - 1: cur -= 3 # substract if one of them doesn't exist if ans < cur: ans = cur l = i r = i + 5 print(ans) print(arr[l:r], l, r) [/pre2]

Ответов - 2

Ж: Вот код, который работает верно (но не очень быстро). Попробуйте с его помощью понять, что вы упускаете. [pre2] s=open('c:/24-262.txt').readline() def g(a): return len(set([c for c in a if c.isdigit()]))>=5 ma=j=0 for i in range(len(s)): if i>=j: j=i+ma while j<=len(s): if s[i:j].count('SOLO')<=4 :j+=1 else: b=s[i:j-1] if g(b) and ma< len(b): ma=max(ma,len(b)) print(i, ma, b) j=i+b.index('SOLO')-3 break [/pre2]

Ж: Вот еще решение "в лоб" - переборное, но меняя вручную старт первого цикла при неудачном поиске, можно его ускорить. [pre2] s=open('d:/1.txt').readline() for i in range(435,1,-1): for j in range(len(s)-i): b=s[j:j+i] if b.count('SOLO')<=4 and len(set(c for c in b if c in '0123456789'))>=5: print(i,b, len(b)) exit() else: print(f'{i} - NO') [/pre2]



полная версия страницы