Анаграммы

Анаграммы

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

После того как он закончил выписывать все перестановки Игорь устал и пошел учиться. Он взял словарь и начал учить новые слова. Через некоторое время Игорь заметил что некоторые из слов в словаре совпадают с записанными им перестановками на листке и задался вопросом, — а какие можно получить слова переставляя буквы из других в словаре.

Игоря будут интересовать только слова которые записаны в словаре, так как других он не знает.

Подумав несколько ночей у него получилось написать программу которая находит слово анаграмму в словаре к другому — данному. Но перед ним встал новый вопрос, — а какое слово имеет наибольшее количество анаграмм в заданном словаре.

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

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

Задан словарь английских слов. Каждое слово в новой строке. Длинна слова не более $255$ символов. Количество слов любое.

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

Вывести все слова что имеют максимальное количество анаграмм в нем.

Решение

Прочитаем словарь. Запишем в структуру pair строку с исходным словом в first и отсортированную в second. Анаграммами будут являться слова с одинаковыми second строками. Так как они будут состоять из одних и тех же букв, которые выстроены в одинаковом порядке. Отсортируем множество слов из словаря по second. Таким образом все слова анаграммы будут находиться рядом.

Теперь пройдемся по словарю и будем проверять соседние элементы. Если они равны, то мы будем увеличивать счетчик анаграмм, если же нет, то мы сравним максимальное количество анаграмм, найденное ранее, с текущим значением счетчика. Если они равны, то добавим индекс последнего слова анаграммы в массив индексов, если же больше, то мы очистим массив индексов и добавим туда индекс последнего слова анаграммы. В любом случае, при не равенстве соседних строк сбрасываем счетчик и продолжаем.

На выходе получим массив индексов слов у которых существует максимальное количество анаграмм, в данном словаре. Выведем эти слова и все анаграммы к ним в исходном варианте. Для этого нам и нужна строка  first.

Тесты

Ввод Вывод
 

1

 

2500 слов английского языка

trace react crate

dear dare read

post stop spot

Код

Код на ideone

4 thoughts on “Анаграммы

  1. Большой плюс, что даете переменным осмысленные названия. Небольшой минус, что делаете это с грамматическими ошибками. Можно придраться, что лучше назвать поле структуры не sort, а sorted, чтобы не перекрывать название соответствующей функции и больше по смыслу подходило, что не совсем понятен смысл названия переменной degree, которая по сути выполняет функции maxCount и что не у всех важных переменных названия осмысленные.
    Насколько я понимаю, структура word дублирует функционал pair < string, string >. Это сделано с умыслом или Вы просто забыли про std::pair?
    И самое главное: если бы словарь английского языка состоял из:
    z
    z
    a
    Ваша программа выдавала бы неправильный результат.

  2. Большое спасибо, я действительно забыл про обработку последнего набора слов, от того и был неправильный ответ.
    Использую структуру, так как там я могу задать свой конструктор, в старых версиях это уменьшало код, сейчас, вероятно, pair будет более уместен.
    Имя переменных пересмотрю.

Добавить комментарий