Клавиатура сотового телефона выглядит так:
1 — пробел |
2 — abc |
3 — def |
4 — ghi |
5 — jkl |
6 — mno |
7 — pqrs |
8 — tuv |
9 — wxyz |
Режим ввода T2005 устроен следующим образом. В телефоне есть словарь. Пользователь, чтобы ввести слово, последовательно нажимает клавиши, на которых написаны буквы этого слова. Например, чтобы ввести слово begin пользователь должен нажимать клавиши 23446. Но как только в словаре оказывается только одно слово с таким началом, это слово автоматически подставляется и, кроме того, после этого слова автоматически добавляется пробел. Например, пусть пользователь нажал клавиши 234, и оказалось, что слов, ввод которых начинается с нажатия именно этих клавиш, — ровно одно. Тогда автоматически подставится это слово и пробел после него, а все последующие нажатия клавиш уже будут относиться к вводу следующего слова.
Если для ввода какого-то слова нужно нажать последовательность клавиш, которая может являться началом какого-то другого слова, то после ввода этого слова нужно нажать клавишу 1, что соответствует вводу пробела. При вводе пробела считается, что вы ввели все слово целиком (а не только какое-либо его начало). Если после ввода пробела оказалось, что в словаре такой последовательности клавиш удовлетворяет несколько слов, подставляется первое из них в алфавитном порядке. Если (опять же после ввода пробела) оказалось, что в словаре нет слова, которое может быть введено такой последовательностью клавиш, то все, что было введено после предыдущего пробела (введенного или автоматически подставленного, или, если в тексте ранее не встречалось ни одного пробела — от начала текста) удаляется. Если после ввода пробела (как нажатием "1", так и автоподстановкой) или в начале текста нажимается клавиша "1", то ее нажатие игнорируется.
Вам дан словарь и последовательность нажатий клавиш. Выведите текст, который был введен пользователем.
Примечание: в тексте используются только маленькие латинские буквы и символ пробел.
Сначала на вход программы поступает число N — количество слов в словаре (2≤N≤100000). В следующих N строках задается словарь. Каждое слово записано в отдельной строке. Слова расположены в алфавитном порядке. Никакое слово в словаре не встречается дважды. Длина каждого слова не превосходит 10 символов.
Далее вводится число M — количество нажатий клавиш (1≤M≤20000). Затем задается M разделяющихся пробелами чисел, описывающих нажатые клавиши. Последней нажатой клавишей всегда является клавиша "1".
Выведите одну строку — текст, который оказался введен пользователем. Пробел после последнего введенного слова также должен быть выведен.
Примечание:
2 |
Примечание: в этом примере выходной файл должен быть создан, но должен быть пустым, в частности, в него не нужно выводить пробел. |
Оценка задачи
1 балл получат программы, правильно решающие задачу при ограничениях 2≤N≤100, 1≤M≤200.
5 po pod sasha shla shosse 12 7 4 5 7 2 7 6 1 7 4 6 1
shla sasha po shosse
2 sem vosem 6 7 8 9 7 8 1
sem vosem
Вася разрабатывает новый веб-сервер. В настоящее время он работает над функцией, осебспечивающей поддержку списков контроля доступа. Список контроля доступа позволяет ограничить доступ к некоторым ресурсам веб-сайта, основываяь на основании IP-адреса запрашивающей стороны.
Каждый IP-адрес \(-\) это 4-байтный номер, который записан байт за байтом в десятичной записи. Байты разделены точками следующим образом: <<byte0.byte1.byte2.byte3>> (кавычки добавлены для ясности). Каждый байт записывается как десятичное число от 0 до 255 (включительно) без ведущих нулей. IP-адреса организованы в IP-сети. IP сети описывается двумя 4-байтовыми числами - сетевым адресом и маской сети. И сетевой адрес и маска сети записаны в той же форме, что и IP-адреса. Для того чтобы понять смысл сетевого адреса и маски сети рассмотрим их двоичное представление. Двоичное представление IP адреса, сетевого адреса и маски сети состоит из 32 бит: 8 бит для byte0 (от старших к младшим), затем по 8 бит для byte1, 8 бит для byte2 и 8 бит для byte3.
IP сеть содержит \(2N\) IP-адресов, где \(0 \leq N \leq 32\). В маске сети первые 32–N бита установлены в единицы, и последние \(N\) бит установлены в ноль. Сетевой адрес имеет произвольные \(32–N\) первых бит, а последние \(N\) бит установлен в ноль. IP сеть содержит все IP-адреса, первые \(32-N\) бит которых равны \(32–N\) первых бит сетевого адреса с произвольными \(N\) последними битами. Например, IP сеть с сетевым адресом 194.85.160.176 и сетевая маска 255.255.255.248 содержит 8 IP-адресов, с 194.85.160.176 по 194.85.160.183 (включительно).
IP сети, как правило, обозначается как <<byte0.byte1.byte2.byte3/S>>, где <<byte0.byte1.byte2.byte3>> \(-\) сетевой адрес, \(S\) \(-\) это число бит, установленных в единицу в маске сети. Например, IP сети из предыдущего абзаца обозначается как 194.85.160.176/29. Список контроля доступа содержит упорядоченный список правил. Каждое правило имеет одну из следующих форм:
deny from <IP network> \(-\) запрещает доступ к ресурсу для любого IP из заданной сети.
deny from <IP address> \(-\) запрещает доступ к ресурсу для указанного IP-адреса.
allow from <IP network> \(-\) разрешает доступ к ресурсу для любого IP из заданной сети.
allow from <IP address> \(-\) разрешает доступ к ресурсу для указанного IP-адреса.
Когда кто-нибудь обращается к какому-либо ресурсу, первым делом проверяется IP-адрес обращающегося по списку контроля доступа. Правила проверяются в том порядке, в котором они перечислены, и применяется первое выполняющееся правило. Если ни одно из правил не соответствует IP-адресу запрашивающей стороны, то доступ предоставляется.
По известному списку контроля доступа и списку запросов от IP-адресов, необходимо выяснить для каждого из запросов будет ли предоставлен доступ к ресурсу.
Первая строка ввода содержит число \(N\) \(-\) количество правил в списке контроля доступа (\(0 \leq N \leq 100 000\)). Следующие \(N\) строк содержат правила по одному в строке. IP сеть всегда записывается как <<byte0.byte1.byte2.byte3/S>>. Следующая строка содержит число \(M\) \(-\) количество IP адресов, которые следует проверить (\(0 \leq M \leq 100 000\)). Следующие \(M\) строк содержат по одному IP адресу в строке.
Для каждого из \(M\) IP-адресов выведите <<A>>, если доступ будет предоставлен, и <<D>> иначе. Все символы следует выводить слитно, не разделяя пробелами.
4 allow from 10.0.0.1 deny from 10.0.0.0/8 allow from 192.168.0.0/16 deny from 192.168.0.1 5 10.0.0.1 10.0.0.2 194.85.160.133 192.168.0.1 192.168.0.2
ADAAA
На одном из телеканалов каждую неделю проводится следующая лотерея. В течение недели участники делают свои ставки. Каждая ставка заключается в назывании какого-либо \(M\)-значного числа в системе счисления с основанием \(K\) (то есть, по сути, каждый участник называет \(M\) цифр, каждая из которых лежит в диапазоне от 0 до \(K-1\)). Ведущие нули в числах допускаются.
В некоторый момент прием ставок на текущий розыгрыш завершается, и после этого ведущий в телеэфире называет выигравшее число (это также \(M\)-значное число в \(K\)-ичной системе счисления). После этого те телезрители, у кого первая цифра их числа совпала с первой цифрой числа, названного ведущим, получают выигрыш в размере \(A_1\) рублей. Те, у кого совпали первые две цифры числа — получают \(A_2\) рублей (при этом если у игрока совпала вторая цифра, но не совпала первая, он не получает ничего). Аналогично угадавшие первые три цифры получают \(A_3\) рублей. И так далее. Угадавшие все число полностью получают \(A_m\) рублей. При этом если игрок угадал \(t\) первых цифр, то он получает \(A_t\) рублей, но не получает призы за угадывание \(t-1\), \(t-2\) и т.д. цифр. Если игрок не угадал первую цифру, он не получает ничего.
Напишите программу, которая по известным ставкам, сделанным телезрителями, находит число, которое должна назвать телеведущая, чтобы фирма-организатор розыгрыша выплатила в качестве выигрышей минимальную сумму. Для вашего удобства ставки, сделанные игроками, уже упорядочены по неубыванию.
В первой строке задаются числа \(N\) (количество телезрителей, сделавших свои ставки, \(1\le N\le 100000\)), \(M\) (длина чисел \(1\le M\le 10\)) \(K\) (основание системы счисления \(2\le K\le 10\)). В следующей строке записаны \(M\) чисел \(A_1\), \(A_2\), ..., \(A_M\), задающих выигрыши в случае совпадения только первой, первых двух,... , всех цифр (\(1\le A_1\le A_2\le ... \le A_M\le 100000\)). В каждой из следующих \(N\) строк записано по одному \(M\)-значному \(K\)-ичному числу. Числа идут в порядке неубывания.
В первой строке выведите искомое число (если решений несколько — выведите любое из них), а во второй строке — сумму, которую при назывании телеведущей первого числа придется выплатить в качестве выигрыша.
10 3 2 1 3 100 000 000 001 010 100 100 100 100 110 111
011 6
1 1 10 100 0
1 0
Недавно разведка перехватила зашифрованное сообщение — строку s. Все ресурсы аналитического центра, в котором вы работаете, были брошены на его декодирование. Ваш отдел занимается шифрами нового поколения. На данный момент известно всего n таких шифров. Для каждого из них есть три характерных параметра — целые числа l, r и строка t. Пусть строка g была получена в результате применения этого метода. Тогда строка glgl+1 . . . gr−1gr (здесь gi — это i-й символ строки g) содержит t как подстроку.
Вам поручено определить для каждого типа шифрования, могло ли сообщение s быть получено в результате его применения.
Первая строка входного файла содержит строку s (1 ≤ |s| ≤ 100 000, где |s| — длина строки s).
Вторая строка входного файла содержит целое число n — количество типов шифрования (1 ≤ n ≤ 100 000). Последующие nстрок содержат по два целых числа li, ri и строку ti, разделенные пробелами — характерные параметры i-го метода шифрования (1 ≤ li ≤ ri ≤ |s|).
Все строки состоят из строчных букв латинского алфавита. Суммарная длина всех ti не превосходит 100 000.
Выведите одну строку — для каждого типа шифрования «+», если сообщение s могло быть получено в результате его применения, или «-» в противном случае.
frommarsiam 3 6 10 i 2 11 am 1 9 human
++-
Вам нужно напечатать \(N\) слов на Movable Type Printer. Movable Type Printers — это старые принтеры, для работы которых требуется ставить маленькие металлические кусочки (каждый из кусочков содержит одну букву) в определенном порядке, образуя таким образом слова. Потом все они вдавливаются в лист бумаги. Таким образом печатается одно слово. Ваш принтер позволяет делать следующие операции:
Изначально на принтере содержится пустое слово. В конце печати на принтере можно оставить непустое слово. Слова, которые вам даны, вы можете печатать в произвольном порядке.
Каждая из трёх операций занимает одну единицу времени. Вам нужно найти последовательность операций, которая печатает данные \(N\) слов за минимальное время. Если минимальных последовательностaей несколько, выведите любую.
Ваша программа должна считать следующие входные данные:
Ваша программа должна вывести следующие данные:
3 print the poem
20 t h e P - - - p o e m P - - - r i n t P