Вот код с утечкой: http://codeforces.com/contest/43/submission/40769170
глючная часть:
auto one = mymap.begin();
auto two = mymap.begin();
two++;
if ((*one).second > (*two).second){
temp = (*one).first;
}else{
temp = (*two).first;
}
Странные решения, которые сработали:
Не использовать авто:
http://codeforces.com/contest/43/submission/40770335
map<string,int>::iterator one = mymap.begin();
map<string,int>::iterator two = mymap.begin();
two++;
объявление карты и строки как глобальных переменных:
http://codeforces.com/contest/43/submission/40769802
map<string,int> mymap;
string temp;
int main() {...}
Я думаю, что вы испытываете неопределенное поведение. Таким образом, может произойти все, что угодно, утечка памяти, сбой или просто работа. Посмотреть здесь:
auto one = mymap.begin();
auto two = mymap.begin();
two++;
if ((*one).second > (*two).second){
// ...
}
two
начинается как итератор первого элемента на карте, который затем увеличивается до второго элемента на карте. Затем вы разыменовываете этот итератор.
Но что, если только одна команда забьет, как в первом тестовом случае? В этом случае на карте будет только один элемент. Поэтому, когда вы увеличиваете two
это будет равно mymap.end()
, Разыменование конечного итератора — неопределенное поведение.
Одним из решений было бы проверить, если two
равно mymap.end()
перед разыменованием:
if (two == mymap.end() || one->second > two->second) {
// ...
}
Других решений пока нет …