Професионална програма
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 313 Точки
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