Алгоритмы(1657 задач)
Структуры данных(279 задач)
Интерактивные задачи(17 задач)
Другое(54 задач)
Жюри N-ской олимпиады по информатике решило зашифровать свои материалы подстановочным шифром. Для шифрования таким шифром задаётся взаимно-однозначное соответствие между буквами алфавита в открытом (т. е. до шифрования) тексте и буквами алфавита в закрытом (т. е. после шифрования) тексте, это соответствие и является ключом шифра. В процессе шифрования каждая буква в открытом тексте заменяется на соответствующую ей букву в закрытом тексте, порядок букв в слове при этом не меняется.
Однако, память у членов жюри оказалась уже не та, что в молодые годы, поэтому часто они путали, какие буквы надо было заменять на какие. В результате теперь они не могут восстановить свои материалы, а олимпиада уже на носу!
Чтобы разрешить свои проблемы, они обратились к вам. Для облегчения вашей задачи они выписали на бумажку все возможные варианты зашифрования букв, которые они могли применять, в виде набора пар "открытая буква" и "зашифрованная буква". Также вам известны все пары букв N-ского алфавита, которые могут следовать одна за другой в открытом тексте. Ваша задача состоит в том, чтобы по заданному зашифрованному слову сказать, соответствует ли ему хоть одно расшифрованное слово, единственен ли вариант расшифровки, и привести пример вариантов расшифровки слова. Слово A считается возможной расшифровкой слова B, если, во-первых, его можно "зашифровать" (заменяя каждую букву на одну из соответствующих ей "зашифрованных" букв), получив слово B, и, во-вторых, каждая пара букв слова A, стоящих рядом, является допустимой для N-ского языка.
N-ский язык пользуется латинским алфавитом из 26 букв, регистр букв N-ское жюри не интересует, поэтому везде в открытом тексте используются большие буквы, а в закрытом — маленькие.
На первой строке входного файла находится одно целое число M (0 ≤ M ≤ 676) — число пар открытых — "зашифрованных" букв, указанных на бумажке, переданной N-ским жюри. Далее следуют M строк, на каждой находятся два символа — сначала открытая буква, потом вариант её "зашифрования". Пары не повторяются.
На следующей строке находится одно целое число K (0 ≤ K ≤ 676) — число пар открытых букв, которые могут идти одна за другой. Далее следуют K строк, на каждой из которых по две открытые буквы, образующие такую пару. Пары не повторяются. Заметим, что возможна ситуация, когда последовательность букв "AB" в слове допустима, а "BA" — нет, в этом случае списке будет дана только пара "AB", а пары "BA" не будет.
На следующей строке расположено одно целое число N (1 ≤ N ≤ 500) — длина зашифрованного слова, а на следующей строке — само слово (N маленьких латинских букв).
Может оказаться так, что какой-то открытой букве не соответствует ни одна "зашифрованная"; это означает, что эта буква в открытом тексте не использовалась.
Если вариантов дешифрования нет ни одного, в первую строку выходного файла выведите "no"
Если вариант дешифрования ровно один, в первую строку выходного файла выведите "only" , а во вторую — дешифрованное слово.
Если вариантов дешифрования больше одного, в первую строку выходного файла выведите "many" , а во вторую и третью и любые два различных варианта дешифрования слова.
0 0 1 u
no
4 Ju Cu Uo Ko 3 JC UJ JK 3 ouo
only UJK
На вступительном экзамене по информатике в СУНЦ МГУ Вашему другу предложили реализовать структуру данных для хранения множеств чисел. Так как он специализируется на истории литературы, данную структуру придётся реализовать Вам.
Структура должна хранить m множеств чисел от 0 до n, при этом одно число может принадлежать сразу нескольким множествам.
Вы должны реализовать следующие операции на этой структуре:
ADD e s
Добавить в множество №s (0 <=
s <= m) число e (0 <= e <= n).
DELETE e s
Удалить из множества №s (0
<= s <= m) число e (0 <= e <= n). Гарантируется,
что до этого число e было помещено в
множество
CLEAR s
Очистить множество №s (0 <=
s <= m).
LISTSET s
Показать содержимое множества
№s (0 <= s <= m), либо -1, если множество
пусто.
LISTSETSOF e
Показать множества, в
которых лежит число e (0 <= e <= n), либо
-1, если этого числа нет ни в одном
множестве.
Сначала вводятся числа N (1 <= N <= 9223372036854775807), M (1 <= M <= 100000) и K (0 <= K <= 100000) — максимальное число, номер максимального множества и количество запросов к структуре данных. Далее следуют K строк указанного формата запросов.
На каждый запрос LISTSET Ваша программа должна вывести числа — содержимое запрошенного множества или -1, если множество пусто.
На каждый запрос LISTSETSOF Ваша программа должна вывести числа — номера множеств, содержащие запрошенное число или -1, если таких множеств не существует.
На прочие запросы не должно быть никакого вывода.
Гарантируется, что правильный вывод программы не превышает одного мегабайта.
10 10 9 ADD 1 1 ADD 1 2 ADD 2 1 LISTSET 1 LISTSETSOF 1 DELETE 1 1 LISTSET 1 CLEAR 1 LISTSET 1
1 2 1 2 2 -1
10 10 5 ADD 1 1 LISTSET 10 LISTSET 1 CLEAR 1 LISTSET 1
-1 1 -1
В одной из звездных систем Галактической Республики произошло дерзкое ограбление банка "13-е Общество межгалактического кредита", из которого было похищено несколько миллиардов буказоидов. Оказалось, что Армия Республики в данном секторе имеет ограниченные силы и не в состоянии блокировать все возможные пути бегства грабителей, поэтому встала задача о минимизации числа кордонов.
Звездные системы соединяются с помощью транспортных коридоров. Один армейский кордон может надежно блокировать только один транспортный коридор. Известно, что грабители еще не успели покинуть ограбленную звездную систему. Кроме этого известно множество систем, в которых грабители могут укрыться. Задача армии состоит в том, чтобы разместить минимальное количество кордонов таким образом, чтобы грабители не могли попасть ни в одну из этих систем.
Первым числорм в потоке входных данных задается общее число N всех звездных систем в галактике (2 ≤ N ≤ 1000). Мы будем предполагать, что все звездные системы пронумерованы от 1 до N. Система, в которой произошло ограбление, имеет номер 1. Далее вводится целое число H, обозначающее количество систем, в которых грабители могут укрыться. Затем перечисляются H целых чисел si (1 ≤ i ≤ H), задающее неповторяющиеся номера звездных систем (2 ≤ si ≤ N) укрытия. После этого вводится число T транспортных коридоров в галактике. Каждый транспортный коридор j (1 ≤ j ≤ T) задается парой целых чисел fj, tj (fj ≠ tj) – номеров звёздных систем, которые он соединяет. Транспортный коридор работает только в одном направлении от системы fj к системе tj. Любая пара звёздных систем может быть соединена максимум одним транспортным коридором. Транспортная сеть такова, что от системы 1 ко всем система sj существует путь, проходящий по транспортным коридорам.
Напечатайте сначала целое число M – минимальное количество необходимых кордонов. Затем напечатайте M транспортных коридоров, которые должны быть заблокированы. Каждый транспортный коридор должен быть выведен как пара целых чисел fk, tk.
5 1 5 6 1 2 1 3 2 3 2 4 3 4 4 5
1 4 5
5 3
3 1 5 2 4
Назовём строкой последовательность из маленьких букв латинского алфавита. Строкой, например, является пустая последовательность, слово «aabaf» или бесконечная последовательность букв «a».
i-ый суффикс Si строки S — это строка S, из которой вырезаны первые i букв; так, для строки S = aabaf суффиксы будут такими:
Суффиксы определены для всех i \(\ge\) 0.
Циклическое расширение S * конечной строки S — это строка, полученная приписыванием её к самой себе бесконечное количество раз. Так,
По заданной строке S выясните, сколько её суффиксов Si имеют такоей же циклическое расширениe, как и строка S, то есть количество таких i, что S * = S * i.
В первой и единственной строке входного файла задана строка S, состоящая из не менее, чем одной, и не более, чем 100000 маленьких латинских букв 'a'-'z'.
Выведите в первую строку выходного файла одно число — количество суффиксов строки S, имеющих такое же циклическое расширение, как и она сама.
aa
2
ab
1
qqqq
4
xyzzyxy
1