Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2013, 15:30   #1
makskovalko
Пользователь
 
Аватар для makskovalko
 
Регистрация: 23.04.2012
Сообщений: 82
По умолчанию Интересная задача

Помогите решить задачу!

Великий архиватор
Ввод/вывод: стандартный
Ограничения по времени: 1 секунда
На планете роботов очень любят автоматическую обработку текстов. Для этого роботы ввели специальную должность Великого Архиватора. В обязанности Великого Архиватора входит составление списка всех слов текста и замена слов на число, обозначающее номер этого слова в списке.
Напишите программу, выполняющую функции Великого Архиватора.
Формат входных данных:
В единственной строке входных данных приводится строка длиной не более миллиона символов, состоящая из строчных и заглавных букв английского алфавита и пробелов. Любые два соседних слова в тексте разделены ровно одним пробелом. Слова считаются одинаковыми, если они равны с точки зрения сравнения строк, причем строчные и заглавные буквы считаются различными.
Формат выходных данных:
В единственной строке выходных данных необходимо вывести последовательность номеров слов текста, причем слова в списке должны быть упорядочены в порядке их появления в тексте. Нумерация слов должна начинаться с единицы.
Примеры входных и выходных данных:
Входные данные
To be or not to be
Why do you cry Willie Why do you cry Why Willie Why Willie Why Willie Why
Выходные данные
1 2 3 4 5 2
1 2 3 4 5 1 2 3 4 1 5 1 5 1 5 1
makskovalko вне форума Ответить с цитированием
Старый 17.06.2013, 17:01   #2
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию

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

а по словам уже обычным сравниваем элементов массива, проставлением индексов и т.д...
пишу код не только за печеньки
VIK_aka_TOR вне форума Ответить с цитированием
Старый 17.06.2013, 17:33   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,318
По умолчанию

Не знаю, насколько получится затратно.

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

Такой вариант может не пройти по количеству памяти, но по времени, на мой взгляд, он более оптимален.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интересная задача Poma][a Паскаль, Turbo Pascal, PascalABC.NET 22 31.03.2013 13:06
Интересная задача Артем123 Паскаль, Turbo Pascal, PascalABC.NET 8 08.06.2011 01:12
Интересная задача! - DannerDOS.kz Паскаль, Turbo Pascal, PascalABC.NET 2 16.12.2008 14:04