Блог пользователя NVAL

Автор NVAL, 9 лет назад, По-русски

Решал одну из простых задач Damascus Collegiate Programming Contest (DCPC 2015). А именно задачу F. Само решение очевидно, буквально пару строк. Поэтому WA крайне удивил. Больше часа искал очевидный баг, случайную запятую после какого-нибудь if'a и так далее, но безуспешно. Посмотрел сабмиты других участников наиболее похожие на мой код и стал плавно менять свой код приближая к чужому AC-коду.

В итоге такой код получает WA: http://pastebin.com/0ErXg0Nw

А такой код AC: http://pastebin.com/Kt585TgD

Разница в том, что строки стали глобальными.

Кто-то может объяснить что вообще происходит и почему так? :|

UPD: проблема решена, тесты по задаче "кривые"

  • Проголосовать: нравится
  • +17
  • Проголосовать: не нравится

»
9 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Я полагаю, что ты должен получить Runtime Error из за стека, но в место такой ошибки выдает WA.

  • »
    »
    9 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

    Длина строк до 8 символов

    Могу приложить посылки с теми же самыми строками, но передаваемыми по ссылке (в том числе строка результата)

    код

    И этот же AC код, но с глобальными переменными

»
9 лет назад, # |
Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится

16035950 Accepted.

Переменные s1 и s2 объявлены до while

  string s1, s2;
    int T;
    scanf("%d", &T);
    while(T--) {
        cin >> s1 >> s2;
        res.clear();
        go(0, s1, 0, s2, "");
        for(set<string>::iterator it = res.begin(); it != res.end(); it++)
                cout << *it << endl;
        cout << endl;
    }
  • »
    »
    9 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Объявление переменных вынесено за пределы цикла и все? Тогда вопрос "что происходит и почему?" остается открытым :)

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Причём все компиляторы так себя ведут — G++/G++11/MSC++. WA когда внутри, и AC когда снаружи

»
9 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Может потому что там количество тестов 16, а написано, что 17?

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится +15 Проголосовать: не нравится

    В общем просто не надо решать контесты от непроверенных авторов))) Эти ребята делают контесты в полигоне и не пишут валидаторы. Там вон еще клар валяется, челик писал на джаве и получил закономерный стектрейс:

    java.lang.NullPointerException
    	at java.util.StringTokenizer.<init>(StringTokenizer.java:199)
    	at java.util.StringTokenizer.<init>(StringTokenizer.java:236)
    	at F$Scanner.next(F.java:82)
    	at F.sol(F.java:45)
    	at F$1.run(F.java:66)
    	at java.lang.Thread.run(Thread.java:745)
    

    но авторы как-то не удосужились все поправить.

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Не уверен, что есть возможность скачивать тесты из тренировок. Я не умею.
    Однако теперь допускаю такую возможность, что тесты кривые. Код, который пытается работать независимо от числа тестов тоже получает WA2, правда даже с глобальными переменными. Теперь хотя бы очевидно, что это косяк не мой и не компилятора. Спасибо, за идею

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Я через тренерский акк посмотрел. Там тест маленький, полностью помещается.

      • »
        »
        »
        »
        9 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Так большие тесты тоже можно смотреть через ftp, если что

        • »
          »
          »
          »
          »
          9 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Если задачи из полигона импортированы, то нельзя.

      • »
        »
        »
        »
        9 лет назад, # ^ |
          Проголосовать: нравится +3 Проголосовать: не нравится

        Что-то я сглупил. Я тоже включил "тренера", но размер вывода меня смутил и я даже не подумал о том, что размер ввода намного меньше и отображается.

        Тестов действительно 16, вместо 17 указанных. На 17-ый тест необходимо выводить тот же ответ, что на 16-ый (такой код дает AC). Это объясняет, почему глобальные переменные работали, а локальные нет.

»
9 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Если объявить char[] внутри цикла, считать через scanf, то проходит https://gist.github.com/anonymous/0d56a7c8a91601006153