Loading...
ViktorVidolov avatar ViktorVidolov 2 Точки

03. Roxettes - C++ Advanced

Здрвейте,

Изпитвам затруднение с примерният изпит от C++ Advanced - Judge Assignment 1. Най-интересно честно казано ми е задачата Roxettes.
До момента успях да стигна до 80/100 със следният код и тестовете които не минават са заради времетраенето на програмата.

 

#include <iostream>
#include <unordered_set>
#include <string>

int main()
{
	char token = ' ';

	std::unordered_set <std::string> dnaSet;

	int counter = 0;
	std::string temp;
	while (token != '.') {
		std::cin >> token;
		temp += token;
		counter++;
		if (counter == 5) {
			if (dnaSet.find(temp) != dnaSet.end()) dnaSet.erase(temp);
			else dnaSet.insert(temp);
			counter = 0;
			temp = "";
		}
	}

	std::cout << *dnaSet.begin();


}

Предполагам, че да използвам unordered_set не е най-оптимално, особено, когато имаме голям брой от елементи в сета, и това забавя програмата. Видях колеги, които са ползвали XOR, което им дава възможността да пазят само един елемент от входа, но не успях да разбера как става.

Ако някой има идея или може да ми обясни, ще съм повече от благодарен.

Тагове:
0
C++ Advanced 02/06/2021 23:38:14
j.petrov_90 avatar j.petrov_90 373 Точки
Best Answer

Привет колега,

В задачата беше заложено "издребняване" относно четенето на входа, за което съм забравил.
Ако трябва да бъда честен и аз каго я реших първия път без XOR оператора извадих 90/100.

Твоето решение си е ОК и работи.
Това, което ти липсва (и което не съм обяснил и си е моя вина) е следния код
  std::cin.sync_with_stdio(false);
  std::cout.sync_with_stdio(false);

Това ще "развърже" С++ stream-овете от С стриймовете.
Това значи че по индивидуално те ще работят по-бързо, но пък логът няма да е последователен, ако ги умешаш.
Ще обясня на упражнението в днес.

Добавяйси тези 2 реда в началото на задачата ти ми извади 100 от 100.

Иначе, ако се абстрахирам от това някой неща, които могат да се подобрят в твоето решение:
std::string e динамична структура от данни. Задалянето на памет динамично е скъпа операция. Би следвало да го избегнем, ако можем. В случая можем. Знаеш, че стринга ти roxxete винаги ще има големина 5. Можеш за го създадеш с такава големина и да не го "зачистваш" всеки път.
Отделно променлива с името "temp" не е ОК.

Поздрави

0
03/06/2021 10:23:22
ViktorVidolov avatar ViktorVidolov 2 Точки

Ооо благодаря много, пооправих някои неща и сега изглежда доста по-добре.
Нямам излишни counter-и и нямам temp променливи :)

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.