Решение задачи Имена с Яндекс Контест

Без пояснения   Просмотров: 1452


На далекой планете Тау Кита есть непонятные нам обычаи. Например, таукитяне очень необычно для землян выбирают имена своим детям. Родители так выбирают имя ребенку, чтобы оно могло быть получено как удалением некоторого набора букв из имени отца, так и удалением некоторого набора букв из имени матери. Например, если отца зовут «abacaba», а мать — «bbccaa», то их ребенок может носить имена «a», «bba», «bcaa», но не может носить имена «aaa», «ab» или «bbc». Возможно, что имя ребенка совпадает с именем отца и/или матери, если оно может быть получено из имени другого родителя удалением нескольких (возможно, ни одной) букв.

Пусть отец по имени X и мать по имени Y выбирают имя своему новорожденному ребенку. Так как в таукитянских школах учеников часто вызывают к доске в лексикографическом порядке имен учеников, то есть в порядке следования имен в словаре, то они хотят выбрать своему ребенку такое имя, чтобы оно лексикографически следовало как можно позже.

Формально, строка S лексикографически больше строки T, если выполняется одно из двух условий: строка T получается из S удалением одной или более букв с конца строки S; первые (i - 1) символов строк T и S не различаются, а буква в i-й позиции строки T следует в алфавите раньше буквы в i-й позиции строки S. Требуется написать программу, которая по именам отца и матери находит лексикографически наибольшее имя для их ребенка.

Код

s1 = input()
s2 = input()
d1 = {}
d2 = {}
for i in range(len(s1)):
    if s1[i] in d1:
        d1[s1[i]].append(i)
    else:
        d1[s1[i]] = [i]
for i in range(len(s2)):
    if s2[i] in d2:
        d2[s2[i]].append(i)
    else:
        d2[s2[i]] = [i]
idx1 = -1
idx2 = -1
s = ''
for i in range(123, 96, -1):
    if chr(i) not in d1 or chr(i) not in d2:
        continue
    k1, k2 = -1, -1
    for j in range(len(d1[chr(i)])):
        if d1[chr(i)][j] > idx1:
            k1 = j
            break
    for j in range(len(d2[chr(i)])):
        if d2[chr(i)][j] > idx2:
            k2 = j
            break
    if k1 != -1 and k2 != -1:
        mn = min(len(d1[chr(i)]) - k1, len(d2[chr(i)]) - k2)
        idx1 = d1[chr(i)][k1 + mn - 1]
        idx2 = d2[chr(i)][k2 + mn - 1]
        s += mn * chr(i)
print(s)

         

Администратор Photo Автор: Администратор



Комментарии

Чтобы написать комментарии вам нужно войти в систему или зарегистрироваться



Заявка на расчет