---> 14 задач <---
Источники
    Личные олимпиады(938 задач)
    Командные олимпиады(684 задач)
Страница: << 1 2 3 >> Отображать по:
ограничение по времени на тест
2.0 second;
ограничение по памяти на тест
256 megabytes

Строка s называется супрефиксом для строки t, если t начинается с s и заканчивается на s. Например, «abra» является супрефиксом для строки «abracadabra». В частности, сама строка t является своим супрефиксом. Супрефиксы играют важную роль в различных алгоритмах на строках.

В этой задаче требуется решить обратную задачу о поиске супрефикса, которая заключается в следующем. Задан словарь, содержащий n слов t1, t2, …, tn и набор из m строк-образцов s1, s2, …, sm. Необходимо для каждой строки-образца из заданного набора найти количество слов в словаре, для которых эта строка-образец является супрефиксом.

Требуется написать программу, которая по заданному числу n, n словам словаря t1, t2, …, tn, заданному числу m и m строкам-образцам s1, s2, …, sm вычислит для каждой строки-образца количество слов из словаря, для которых эта строка-образец является супрефиксом.

Входные данные

Первая строка входного файла содержит целое число n (1 ≤ n ≤ 200 000).

Последующие n строк содержат слова t1, t2, …, tn, по одному слову в каждой строке. Каждое слово состоит из строчных букв латинского алфавита. Длина каждого слова не превышает 50. Суммарная длина всех слов не превышает 106. Словарь не содержит пустых слов.

Затем следует строка, содержащая целое число m (1 ≤ m ≤ 200 000).

Последующие m строк содержат строки-образцы s1, s2, …, sm, по одной на каждой строке. Каждая строка-образец состоит из строчных букв латинского алфавита: Длина каждой строки-образца не превышает 50. Суммарная длина всех строк-образцов не превышает 106. Никакая строка-образец не является пустой строкой.

Выходные данные

Выходной файл должен содержать m чисел, по одному на строке.

Для каждой строки-образца в порядке, в котором они заданы во входном файле, следует вывести количество слов словаря, для которых она является супрефиксом.

Система оценки

Решения, работающие при \(n\), \(m\) не превосходящими 100 оцениваются из 30 баллов.

Примеры
Входные данные
4
abacaba
abracadabra
aa
abra
3
a
abra
abac
Выходные данные
4
2
0
ограничение по времени на тест
5.0 second;
ограничение по памяти на тест
128 megabytes

Система телефонных номеров в России устроена следующим образом. Все телефонные номера имеют одну и ту же длину — M цифр. Номер состоит из двух частей: несколько первых цифр номера составляют код города, остальные цифры определяют номер абонента в пределах этого города.

В процессе развития сети коды городов регулярно меняются, при этом, коды различных городов обязательно различны. В остальном коды могут быть совершенно произвольными, в том числе код одного города может быть началом кода другого (например, код Нижнего Новгорода — 831, а код Сарова — 83130) и т. п. Если коды нескольких городов являются началом M-значного номера абонента, кодом города этого номера считается наидлиннейший из таких кодов. Так, если есть всего четыре города: Нижний Новгород, Балахна, Дзержинск и Саров с кодами, соответственно, 831, 83144, 8313 и 83130, и M = 9, то: телефоны 831123456 и 831412345 — телефоны Нижнего Новгорода, 831312345 — телефон Дзержинска, 831301234 — Сарова, а 831441234 — Балахны.

В этой задаче мы не будем учитывать различные другие ограничения на телефонные номера, существующие в реальности (например, в реальности никакой номер абонента в городе не может начинаться на 03, т. к. 03 — это телефон скорой помощи). Мы будем считать, что любой из 10M возможных M-значных номеров является допустимым телефонным номером.

Нетривиальной задачей становится задача определения, сколько всего телефонных номеров может быть выдано в каждом городе. Например, в приведённом выше примере в Балахне и Сарове могут быть выданы 10 000 телефонных номеров (все четырёхзначные номера), в Дзержинске могут быть выданы 90000 телефонных номеров — все пятизначные телефонные номера, кроме начинающихся на ноль, а в Нижнем Новгороде могут быть выданы 890 000 номеров — все шестизначные номера, кроме тех, которые начинаются на цифру 3, а также на последовательность 44.

Напишите программу, которая решит эту задачу для произвольного набора кодов городов.

Входные данные

На первой строке входного файла находятся два числа N и M — количество городов и длина полного телефонного номера (1 ≤ N ≤ 100 000, 1 ≤ M ≤ 9). Далее следуют N строк, в каждой из которых находится код очередного города и название города, между которыми находится ровно один пробел. Название города состоит только из заглавных и маленьких латинских букв и не превышает по длине 20 символов. Гарантируется, что в каждой из этих строк входного файла будет ровно один пробел — между кодом города и его названием.

Города во входном файле отсортированы по алфавитному порядку кодов. Гарантируется, что никакие два кода и никакие два названия города не совпадают.

Выходные данные

В выходной файл выведите N строк. В каждой строке выведите название города и количество телефонных номеров, которые можно выдать в этом городе. Отделяйте название города и количество номеров как минимум одним пробелом. Вы также можете выводить лишние пробелы в начало и конец каждой строки; они будут игнорироваться.

Города можете выводить в произвольном порядке.

Примеры
Входные данные
4 9
831 NizhnyNovgorod
8313 Dzerzhinsk
83130 Sarov
83144 Balakhna
Выходные данные
Sarov 10000
Dzerzhinsk 90000
Balakhna 10000
NizhnyNovgorod 890000
ограничение по времени на тест
2.0 second;
ограничение по памяти на тест
64 megabytes

Цепочкой слов длины n назовем последовательность слов w1, w2, ..., wn такую, что для 1 ≤ i ≤ n слово wi является собственным префиксом слова wi + 1.

Напомним, что слово u длины k называется собственным префиксом слова v длины l, если l > k и первые k букв слова v совпадают со словом u.

Задано множество слов S = {s1, s2, ..., sm}. Найдите максимальную длину цепочки слов, которую можно построить, используя (возможно, не все) слова этого множества.

Входные данные

Первая строка входного файла содержит целое число m(1 ≤ m ≤ 255). Каждая из последующих m строк содержит по одному слову из множества S.

Все слова не пусты, имеют длину, не превосходящую 255 символов, и состоят только из строчных букв латинского алфавита.

Выходные данные

В выходной файл выведите ответ на задачу.

Примеры
Входные данные
3
a
ab
abc
Выходные данные
3
Входные данные
5
a
ab
bc
bcd
add
Выходные данные
2
#111779
  
Темы: [Список] [Бор]
ограничение по времени на тест
1.0 second;
ограничение по памяти на тест
256 megabytes

Многие пользователи мобильных телефонов при наборе sms-сообщений используют режим T9. При этом сообщения, например на английском языке, они набирают следующим образом. Для набора слова по буквам соответствующая букве кнопка нажимается один раз, вне зависимости от того, сколько букв соответствуют этой кнопке, и какой по счету идет нужная буква (см. картинку), а программа в телефоне подбирает из имеющегося словаря подходящее для данной комбинации кнопок слово. Если подходящих слов несколько, то в первую очередь предлагается наиболее часто встречающееся слово (изначально слова одинаковой встречаемости предлагаются по алфавиту). Если слово не подошло, то пользователь нажимает кнопку ‘*’ и программа предлагает второе по встречаемости слово, образуемое той же комбинацией кнопок (в первую очередь следующее слово с той же частотой встречаемости, если такое имеется). Если и оно не подошло, то кнопка ‘*’ нажимается еще раз и т.д. Для простоты будем считать, что современные модели телефонов содержат полный словарь используемых слов, и нужное слово обязательно найдется. Когда предлагаемое слово подошло, пользователь нажимает на кнопку “пробел”, нажимает на кнопку ‘1’ (последняя соответствует набору знака препинания), или заканчивает набирать сообщение. Когда знак препинания не подошёл, опять же нажимается кнопка ‘*’, до тех пор пока не появится требуемый знак. После набора пробела или знака препинания пользователь может ввести ещё один пробел или знак препинания, начать набирать следующее слово или закончить набирать сообщение. Будем считать, что пользователю достаточно трех знаков препинания, и они предлагаются в следующем порядке: точка (‘.’), запятая (‘,’), вопросительный знак (‘?’). После того как пользователь “утвердил” набранное слово (нажав на пробел или ‘1’), частота его встречаемости в словаре увеличивается на 1, и новое значение частоты учитывается, в том числе, и при наборе в режиме T9 остальных слов того же сообщения. При этом данное слово будет предлагаться первым среди слов с такой же частотой встречаемости, порядок предложения остальных слов остается неизменным. Когда появится еще одно слово с той же частотой, то уже оно будет предлагаться первым, не меняя порядка остальных, и т. д. Вам требуется написать программу, которая по имеющемуся словарю, содержащему первоначальные характеристики частоты встречаемости того или иного английского слова, и известной последовательности нажатий кнопок пользователем при наборе sms-сообщения в режиме T9 воспроизведет появившееся на экране сообщение.

Входные данные

В первой строке входного файла находится целое число N (3 ≤ N ≤ 50000) — количество слов в словаре. В каждой из следующих N строк записаны одно слово словаря и через пробел натуральное число F (1 ≤ F ≤ 1000) — первоначальное значение частоты встречаемости этого слова (чем больше значение, тем чаще встречается данное слово). Числовая характеристика частоты встречаемости отделена от слова ровно одним пробелом. Слова в словаре состоят только из строчных английских букв и расположены в алфавитном порядке. Длина слова не превышает 20 символов. Все слова не пустые и различные. Последняя строка файла состоит из цифр от 1 до 9 и символов “пробел” и ‘*’, обозначающих последовательность нажатий кнопок при наборе сообщения. Длина этой строки не превосходит 100000 символов.

Выходные данные

Выведите в выходной файл текст sms-сообщения.

Примеры
Входные данные
5
ad 2
be 1
not 10
or 5
to 50
86 23* 67 668 86 231**
Выходные данные
to be or not to be? 
Входные данные
3
act 1
bat 1
cat 1
228* 228** 228** 228**1
Выходные данные
bat cat act bat. 
#111788
  
Темы: [Бор]
ограничение по времени на тест
2.0 second;
ограничение по памяти на тест
64 megabytes

Одна из новых возможностей текстового редактора «World XP» — это сортировка слов в предложении. Выход новой бета-версии редактора должен состоятся не позднее, чем через пять часов, а заявленная функция еще не реализована.

Требуется написать программу, осуществляющую сортировку слов в предложении. При этом все символы, отличные от букв, должны сохранится и не поменять своего положения относительно вхождений слов. Для упрощения при подаче входных данных на вход вашей программы все такие символы будут заменены на символ «.» (точка). Таким образом символ «.» имеет смысл разделителя между словами. Например, строка «..aba.a..ba» после сортировки пример вид «..a.aba..ba», а строка «c..bb.a» примет вид «a..bb.c». Слова следует сортировать лексикографически, как в словаре.

Входные данные

Входной файл содержит единственную строку, содержащую только прописные латинские буквы и символ «.». Слова могут разделяться любым количеством символов «.», строка может как начинаться, так и заканчиваться последовательностью точек. Длина заданной строки не менее 1 символа и не превосходит 106 символов.

Выходные данные

В выходной файл выведите строку после сортировки слов в ней.

Примеры
Входные данные
..aba.a..ba
Выходные данные
..a.aba..ba
Входные данные
c..bb.a
Выходные данные
a..bb.c

Страница: << 1 2 3 >> Отображать по:
Выбрано
:
Отменить
|
Добавить в контест