Задача
Дано следующее кодирование цифр в буквы (каждой цифре соответствует одна или более буква, регистр буквы значения не имеет):
- 0: e
- 1: j n q
- 2: r w x
- 3: d s y
- 4: f t
- 5: a m
- 6: c i v
- 7: b k u
- 8: l o p
- 9: g h z
Мы хотим использовать это кодирование для записи телефонных номеров в виде слов, для более легкого запоминания.
Написать программу, которая для заданного телефонного номера выводит все возможные кодировки в виде набора слов. Телефонный номер - это произвольная(!) строка, состоящая из символов -
, /
и цифр от 0 до 9. Только цифры участвуют в кодировании, остальные символы игнорируются. Слова берутся из словаря в виде отсортированного по алфавиту текстового ASCII файла (по одному слову на строку).
Некоторые телефонные номера невозможно закодировать словами из предложенного словаря, в этом случае ничего печатать не нужно. Слова в словаре состоят из букв (как строчных, так и заглавных, но сортировка не делает между ними разницы), символов -
и "
. Только буквы используются при кодировании, но в финальном выводе слова должны быть указаны в той же форме, что и в словаре.
Результат кодирование состоит из одного или нескольких слов, разделенных пробелами. Кодирование выполняется последовательно, одно слово за другим, слева направо. Если в определенный момент никакое слово из словаря не подходит, то можно скопировать одну цифру из телефонного номера (вставить её на место одного из слов). Две и более цифры друг за другом не допустимы.
In a partial encoding that currently covers
k
digits, digitk+1
is encoded by itself if and only if, first, digitk
was not encoded by a digit and, second, there is no word in the dictionary that can be used in the encoding starting at digitk+1
.
Программа запускается со списком телефонных номеров и словарем на входе. Для каждого номера, кодирование которого возможно, программа выводит телефонный номер, двоеточие, один пробел и затем закодированный номер.
Пример: Словарь:
an
blau
Bo"
Boot
bo"s
da
Fee
fern
Fest
fort
je
jemand
mir
Mix
Mixer
Name
neu
o"d
Ort
so
Tor
Torf
Wasser
Телефонные номера:
112
5624-82
4824
0721/608-4067
10/783--5
1078-913-5
381482
04824
Вывод программы:
5624-82: mir Tor
5624-82: Mix Tor
4824: Torf
4824: fort
4824: Tor 4
10/783--5: neu o"d 5
10/783--5: je bo"s 5
10/783--5: je Bo" da
381482: so 1 Tor
04824: 0 Torf
04824: 0 fort
04824: 0 Tor 4
Любые другие строки в выводе будут неверны. Например:
562482: Mix Tor
: форматирование телефонного номера не соответствует исходному10/783--5: je bos 5
: форматирование второго слова не соответствует исходному4824: 4 Ort
: использована цифра 4, хотя на её место подходят словаTorf
fort
Tor
1078-913-5: je Bo" 9 1 da
: две последовательные цифры04824: 0 Tor
: не все цифры номера использованы5624-82: mir Torf
: букв в выводе больше чем исходных цифр (использовано больше цифр, чем в номере)
Совет
Если программа выводит лишние ответы (по сравнению с эталонным output.txt
), проверьте ваш алгоритм кодирования: вставлять цифру из иходного номера можно только в том случае, если ни одно из слов словаря не подходит.
Для проверки предоставлены файлы input.txt
, output.txt
и dictionary.txt
Ограничения
- Длина отдельных слов в словаре: не более 50 символов
- Число слов в словаре: не более 75000
- Длина телефонных номеров: не более 50 символов
- Число телефонных номеров на входе: неограничено
Программа должна быть корректной, так как будет протестирована на большем объеме входных данных.
Программа должна быть эффективной как по использованию времени процессора, так и по использованию памяти.