Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/55: Рейтинг темы: голосов - 55, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 16.05.2020
Сообщений: 4

Задача "Система регистрации" из codeforces

16.05.2020, 03:56. Показов 10576. Ответов 10

Студворк — интернет-сервис помощи студентам
При отправки задачи моё решение проваливается на седьмом проходе и жалуется, что превышено ограничение времени.
Помогите пожалуйста оптимизировать или исправить решение.
Текст задачи:
В скором времени в Берляндии откроется новая почтовая служба "Берляндеск". Администрация сайта хочет запустить свой проект как можно быстрее, поэтому они попросили Вас о помощи. Вам предлагается реализовать прототип системы регистрации сайта.

Система должна работать по следующему принципу. Каждый раз, когда новый пользователь хочет зарегистрироваться, он посылает системе запрос name со своим именем. Если данное имя не содержится в базе данных системы, то оно заносится туда и пользователю возвращается ответ OK, подтверждающий успешную регистрацию. Если же на сайте уже присутствует пользователь с именем name, то система формирует новое имя и выдает его пользователю в качестве подсказки, при этом подсказка также добавляется в базу данных. Новое имя формируется по следующему правилу. К name последовательно приписываются числа, начиная с единицы (name1, name2, ...), и среди них находят такое наименьшее i, что name i не содержится в базе данных сайта.


Входные данные
В первой строке входных данных задано число n (1 ≤ n ≤ 10^5). Следующие n строк содержат запросы к системе. Каждый запрос представляет собой непустую строку длиной не более 32 символов, состоящую только из строчных букв латинского алфавита.

Выходные данные
В выходных данных должно содержаться n строк — ответы системы на запросы: ОК в случае успешной регистрации, или подсказку с новым именем, если запрашиваемое уже занято.
входные данные
4
abacaba
acaba
abacaba
acab
выходные данные
OK
OK
abacaba1
OK

Моё решение:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def fun(names, match_name):
    j = 1
    while True:
        new_name = match_name + str(j)
        if names.get(new_name):
            j += 1
        else:
            names[new_name] = new_name
            break
    return True
 
 
number = int(input())
d = {}
for i in range(number):
    a = input()
    if d.get(a):
        fun(d, a)
    else:
        d[a] = 'OK'
for i in d:
    print(d.get(i))
В седьмом проходе в программу загружается 100000 слов, у меня на компьютере 100000 слов он переваривает и выводит за ~5.5 сек (замеры производил с помощью datetime)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.05.2020, 03:56
Ответы с готовыми решениями:

Задача с Codeforces
Разбирал самый первый контест вот и столкнулся с такой проблемой не понимаю на чем основывается вывод получения сторон. Вот собственно...

Задача с Codeforces, уровень A
Вроде простая задача, а я затупил. Неправильный ответ на тесте 5 Ограбление Банка Преступник попытался ограбить банк, но не смог...

Задача А. Взята с codeforces
Вам даны два целых числа n и m. Вам нужно построить массив a длины n состоящий из неотрицательных целых чисел (т.е. целых чисел больших или...

10
 Аватар для codcw
815 / 527 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
16.05.2020, 05:24
frick_, а почему не использовать in в функции?
и зачем вы в ней возвращаете True?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
db = {}
n = int(input())
for _ in range(n):
    s = input()
    if s not in db:
        db[s] = 'OK'
        print('OK')
    else:
        i = 1
        while True:
            if s + str(i) in db:
                i += 1
            else:
                i = s + str(i)
                db[s + str(i)] = 'OK'
                print(i)
                break
как-то так решил, не уверен что правильно или быстро, но всё же

Добавлено через 16 минут
проверил, падает на 5 тесте

ну да ладно, я сделал всё что мог
0
0 / 0 / 0
Регистрация: 16.05.2020
Сообщений: 4
16.05.2020, 05:45  [ТС]
Заменил .get() на in и убрал return True и мои 100000 имён теперь выводит быстрее чем за 5 сек (как и нужно в задаче), но на сайте всё равно пишет "Превышено ограничение времени на тесте 7"
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
16.05.2020, 08:24
Лучший ответ Сообщение было отмечено frick_ как решение

Решение

если я правильно понял:
Python
1
2
3
4
5
6
7
8
d = dict()
for _ in range(int(input())):
    s = input()
    d[s] = d.get(s, -1) + 1
    if d[s] == 0:
        print('OK')
    else:
        print(s, d[s], sep='')
2
 Аватар для Semen-Semenich
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
16.05.2020, 09:54
eaa, сдается мне что вы забыли добавлять нового пользователя.
5
abacaba
acaba
abacaba
acab
abacaba1
результат:
{'abacaba': 1, 'acaba': 0, 'acab ': 0, 'abacaba1': 0} один пользователь пропал, кажется должно быть
{'abacaba': 1, 'acaba': 0, 'acab ': 0, 'abacaba1': 1, 'abacaba2': 0}
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
16.05.2020, 10:40
Semen-Semenich,
Цитата Сообщение от frick_ Посмотреть сообщение
состоящую только из строчных букв латинского алфавита.
0
 Аватар для Semen-Semenich
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
16.05.2020, 17:21
eaa,
Цитата Сообщение от frick_ Посмотреть сообщение
Если же на сайте уже присутствует пользователь с именем name, то система формирует новое имя и выдает его пользователю в качестве подсказки, при этом подсказка также добавляется в базу данных.
может я что то не совсем догоняю
5
abacaba
acaba
abacaba
acab
abacaba
OK
OK
abacaba1
OK
abacaba2
{'abacaba': 2, 'acaba': 0, 'acab': 0}
но в базе должны быть
{'abacaba': 1, 'acaba': 0, 'acab ': 0, 'abacaba1': 1, 'abacaba2': 0}
мы же должны добавить нового пользователя после подсказки. то есть если уже есть 'abacaba' то новый будет 'abacaba1' и при вводе 'abacaba' должен быть сформирован новый пользователь 'abacaba2' так как 'abacaba1' уже есть.
Цитата Сообщение от frick_ Посмотреть сообщение
Новое имя формируется по следующему правилу. К name последовательно приписываются числа, начиная с единицы (name1, name2, ...), и среди них находят такое наименьшее i, что name i не содержится в базе данных сайта
вообщем тут непонятки. ну раз автор отметил ваш код как решение значить все так должно и быть.
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
16.05.2020, 17:44
Semen-Semenich, проверил сейчас на сайте, все тесты проходит. 2 секунды.
0
0 / 0 / 0
Регистрация: 16.05.2020
Сообщений: 4
16.05.2020, 18:39  [ТС]
Semen-Semenich, по логике задачи ты прав, и, кстати говоря, мой код именно что добавляет подсказку в бд, но с точки зрения нужного вывода код eaa работает быстрее. На самом деле обидно то, что у меня на компьютере задача всё-таки даже со 100000 слов выполняется за ~4.7 сек, а сайт её так и не принял.
Прикрепляю свои 100000 имён и свой окончательный код
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def fun(names, match_name):
    j = 1
    while True:
        new_name = match_name + str(j)
        if new_name in names:
            j += 1
        else:
            names[new_name] = new_name
            break
 
 
number = int(input())
d = {}
for i in range(number):
    a = input()
    if a in d:
        fun(d, a)
    else:
        d[a] = 'OK'
for i in d:
    print(d.get(i))
0
0 / 0 / 0
Регистрация: 16.05.2020
Сообщений: 4
16.05.2020, 18:45  [ТС]
вот мои имена
Вложения
Тип файла: 7z names.7z (3.0 Кб, 3 просмотров)
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
17.05.2020, 06:13
frick_, причем тут вывод? Сложность своего алгоритма посчитайте.

Добавлено через 1 минуту
введите 100000 одинаковых имен из 32 символов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.05.2020, 06:13
Помогаю со студенческими работами здесь

Codeforces задача A. Way Too Long Words
Добрый день Я решаю задачу на codeforces https://codeforces.com/contest/71/problem/A Код на С++ написал и он работает (ниже). ...

Нахождение суммы остатков (задача с Codeforces)
Здравствуйте! Сейчас я пытаюсь решить задачу. Суть такая - даются числа n и m, необходимо подсчитать сумму ряда типа n mod 1 + n mod 2...

Задача "Светофоры" с codeforces. Код слишком медленный
Выходит ошибка на 9 тесте, указывающая что программа слишком медленная. Как ускорить код? Сама задача -...

Задача с codeforces "Бьем чудовище"
ПОДСКАЖИТЕ АЛГОРИТМ И СРЕДСТВА РЕШЕНИЯ ДАННОЙ ЗАДАЧ

Задача с codeforces "Беру-такси"
Рабочий Василий живёт в точке (a, b) координатной плоскости. Он очень торопится на работу, поэтому ему нужно как можно быстрее уехать из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru