0

Палиндром – это строка, которая одинаково читается как слева направо, так и справа налево.

Дан набор из n строк (1 ≤ n ≤ 105). Найдите среди них такие пары, которые при конкатенации дают палиндром. Более формально, найдите все пары (i, j) такие, что i ≠ j и строка si+sj является палиндромом.

Выведите все упорядоченные пары индексов (нумерация с единицы).

Формат ввода В первой строке дано целое число n (1 ≤ n ≤ 100 000) — количество строк.

Далее в n строках записано по одному слову. Длина каждого слова от 1 до 10. Слова состоят из маленьких букв английского алфавита.

Пример 1.

Ввод:

4

a

abbaa

bba

abb

Вывод:

1 2

1 3

2 3

3 4

4 1

4 3

Как вычислять палиндром мне ясно, а как ввод данных выполнить в питоне? Не знаю, как правильно начать?

Может подскажет кто?

  • 3
    Подсказать что? В чём возникла проблема у вас? – andreymal Feb 24 '24 at 21:13
  • у меня 4 строчки, то есть, n = int(input()), дальше мне необходимо строки первую строчку склеить со второй "a+abbaa" .. как это оформить? вообще, мне бы задачу решить)))))) – Сергей Марченко Feb 24 '24 at 21:19
  • 1
    Прочитать учебник и затем с помощью полученных знаний оформить всё необходимое – andreymal Feb 24 '24 at 21:25
  • 2
    Введите данные в список, например, for _ in range(n): lst.append(input()) Однако для решения задачи с данными ограничениями простого перебора будет маловато, нужен эффективный алгоритм. Впрочем, сначала сделайте по-простому, чтобы работало. – MBo Feb 25 '24 at 04:16
  • План решения задачи: научиться вводить данные, научиться работать со строками и циклами, решить задачу наивным алгоритмом, на частном примере этой задачи понять что такое О-большое, изучить структуры для быстрого поиска строк, реализовать одну из них (trie, возможно, подойдёт), научится генерировать тестовые данные, отладить реализацию, сдать задачу. Если учить нормально, полгода-год. Если галопом по европам, за две недели. Если нанять человека, то два часа. – Stanislav Volodarskiy Feb 25 '24 at 08:13

1 Answers1

0

Так пойдёт?

n = int(input()) # количество строк, которое будет введено
strokes = [] # все введённые строки
match = [] # все совпадения

for i in range(n): stroke = input() # строка strokes.append(stroke)

for i in range(n): for j in range(i + 1): if i != j: concat = strokes[i] + strokes[j] if concat == concat[::-1]: match.append([i+1, j+1])

for i in range(len(match)): print(match[i][0], match[i][1], sep = ", ")

  • 1
    Спасибо большое!!! – Сергей Марченко Feb 25 '24 at 06:44
  • подскажите, вышеуказанный код можно ускорить? один тест не прошел по времени.. – Сергей Марченко Feb 25 '24 at 07:38
  • 2
    Вы пишете код, отвечая на вопрос "а как ввод данных выполнить в питоне"? Со всем уважением, но решение олимпиадных задач за людей, которые не знают язык - странный способ помогать. – Stanislav Volodarskiy Feb 25 '24 at 08:04
  • я пытаюсь освоить язык, а в учебниках не всегда все понятно объясняют...хотел бы попасть на курсы, на которых обучают... вот и пытаюсь всеми возможными способами... – Сергей Марченко Feb 25 '24 at 08:15
  • @СергейМарченко Извините, но я пока не знаю, как ускорить код. Если мне в голову придёт идея, я перепишу код. – ArseniyRybasov Feb 25 '24 at 09:13
  • 1
    Реально, как человеку, который не знает, как осуществляется ввод данных, разъяснить олимпиадную задачу? Такие обычно и в ЕГЭ решаются с вероятностью 5%. – Глеб Feb 25 '24 at 09:38
  • @ArseniyRybasov Ну в два раза сможете ускорить, если циклы организовать разумнее? (Для олимпиады этого не хватит) – MBo Feb 25 '24 at 13:04
  • @MBo Как? (Я начинающий программист, не ругайтесь на меня) – ArseniyRybasov Feb 25 '24 at 13:53
  • @ArseniyRybasov Я не ругался, это подсказка. Для чего внутренний цикл по j проходит все значения с нуля? Можно ведь начать с i+1, и проверка не понядобится – MBo Feb 25 '24 at 18:06
  • @MBo Точно. Я забыл, что если я начну внутренний цикл с нуля, я в половине случаев пройдусь по уже проверенным парам. Сейчас исправлю. Готово. – ArseniyRybasov Feb 27 '24 at 05:18
  • @СергейМарченко Я исправил код, так он должен пройти по времени. – ArseniyRybasov Feb 27 '24 at 05:20
  • Спасибо огромное!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! – Сергей Марченко Feb 27 '24 at 05:58
  • Исправил неправильный перевод слова "совпадение". – ArseniyRybasov Feb 27 '24 at 06:22
  • @StanislavVolodarskiy Больше похоже на сириусовскую задачу. – ArseniyRybasov Feb 27 '24 at 06:30
  • это была задача для поступления в яндекс-школу (нужны были минимальные знания по программированию (эта задача самая легкая...)). я понял, что совсем не готов... – Сергей Марченко Feb 27 '24 at 06:48