Advertisement
tiom4eg

V2 FastParse

Apr 16th, 2022 (edited)
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.23 KB | None | 0 0
  1. // s - буфер ввода (обычно input), pos - массив с ОДНИМ числом (позицией текущего элемента буфера), изначально равным 0. именно массив, чтобы число можно было менять прямо из функции
  2. // обновил код, теперь можно вводить числа меньше 0 (с минусом)
  3. // Ниже паста, которую нужно писать в мысли, чтобы не прикопались к превриттену
  4. // ------------
  5. Посмотрев на входные данные, понимаем, что ввод состоит только из чисел, но этих чисел там очень много. То есть, обычный парсинг через split будет работать крайне долго
  6. Значит, нужно написать свой парсер, который будет итерироваться по всей строке не много раз, а один, при этом не создавая много дополнительных переменных.
  7. Напишу свой парсер в функции read, в качестве аргументов он будет принимать строку ввода и позицию, на которой мы остановились при парсинге в прошлый раз.
  8. Для начала, проверим, является ли первый символ числа знаком минуса. Если да, заведём специальный флаг, который нам будет напоминать. что мы считали отрицательное число.
  9. Затем, начинается само число. Будем посимвольно считывать его, пока текущий символ относится к цифрам ("0" - "9"). Если это не так, прерываем считывание и возвращаем число с учётом знака.
  10. Заметим, что аргумент pos - это массив, состоящий из одного числа, в котором мы храним текущую позицию в строке ввода. Я храню именно массив из одного числа, поскольку массивы передаются по
  11. ссылке и значения их элементов можно менять в любой функции, в отличие от чисел, которые передаются не по ссылке -> их значение в функции не меняется.
  12. Наконец, в функции solve на конец input припишу пробел, чтобы при считывании последнего числа парсер не завис в бесконечном цикле.
  13. // ------------
  14. function read(s: string, pos: int[]) -> int {
  15.     let sign = 1;
  16.     let num = 0;
  17.     if (s.charCodeAt(pos[0]) == 45) {
  18.         sign = -1;
  19.         pos[0] += 1;
  20.     }
  21.     while (true) {
  22.         let d = s.charCodeAt(pos[0]) - 48;
  23.         pos[0] += 1;
  24.         if (d < 0) { break; }
  25.         num = 10 * num + d;
  26.     }
  27.     return sign * num;
  28. }
  29.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement