• Почему C/C++ проекты очень долго компилируются?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Компилятор долго оптимизирует код. Смотрит, что где используется, что можно выкинуть, где можно переставить местами что-то неважное, где цикл развернуть, где еще чего. Очень много оптимизаций. Обработка каждого файла - долгое дело.

    Архаичная система заголовочных файлов же приводит к тому, что при изменении небольшой части проекта, фактически меняется куча файлов, которые все надо заново парсить и оптимизировать.
    Ответ написан
    4 комментария
  • Поможете с ошибкой c++?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Закоментированная секция:
    //private:
    //{
    //    QPointF m_mousePoint;
    //};


    Должно быть без фигурных скобок.
    Ответ написан
    Комментировать
  • Есть ли уже существующая структура данных для данной задачи?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Смотрите решение задачи о рюкзаке через динамическое программирование.

    Постройте двумерный массив, который будет говорить, можно ли собрать данную сумму первыми k объектами.

    Используя его можно относительно быстро восстанавливать все множества с заданной суммой а заодно посмотреть, какие суммы возможно набрать.
    Ответ написан
    1 комментарий
  • Как вернуть map из функции и использовать его в другой функции?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    map<int,int> f(x) {
    ...
    }
    
    map<int, int> mp = f(x);
    Ответ написан
    1 комментарий
  • Как найти нижнюю границу сложности алгоритма?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Тут на глаз можно. Очевидно же, что T(n) > n. Поэтому можно взять n как нижнюю границу.
    Ответ написан
    Комментировать
  • Как реализовать правосторонний бинарный поиск?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Уберите проверку на совпадение внутри while. Присваивайте границам интервала mid, а не mid+1 или -1.
    Ответ написан
    Комментировать
  • JavaScript - как проверить, есть ли в объекте циклические ссылки?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Поиск в глубину.

    Надо поддерживать список/множество уже посещенных вершин и пока посещаемых (те, что в стеке). При заходе в вершину в рекурсивной функции помещайте ее в множество пока посещаемых. При возвращении из функции перемещайте вершину в множество уже посещенных. В функции пройдитесь по всем ребрам, если они ведут в пока посещаемую вершину - вы нашли цикл. Если ребро ведет в уже посещенную - игнорируйте его. Если ребро ведет в не посещенную вершину - рекурсивно запускайтесь от нее.
    Ответ написан
    Комментировать
  • В чем здесь ошибка?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Ошибка в том, что разряды в задаче пронумерованы от младших к старшим.

    У вас же берется срез в строке, где разряды пронумерованы от старших к младшим.

    Вам надо или строку развернуть, или номера разрядов пересчитать, учитывая длину строки.
    Ответ написан
    Комментировать
  • Как правильно использовать getopt?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    https://man7.org/linux/man-pages/man3/getopt.3.html

    Прокрутите вниз, там есть пример в examples.

    Проще некуда. Понять за вас никто не сможет.
    Ответ написан
    Комментировать
  • Как определить зависимость между числами зная несколько начальных значений и конечное?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    В общем случае никак. Надо реверс-инженирить код проверяющий или генерящий пароли. Еще, как вариант взлома, можно попробовать поменять счетчик паролей и вводить старый пароль.

    В самом печальном для вас случае там используется криптография. Тогда не имея доступа к секретному ключу у производителя пароль никак не сгенерировать даже имея весь код генерации и проверки пароля.
    Ответ написан
    Комментировать
  • Как связать динамическую библиотеку с кодом cpp?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Пока похоже ошибка не с библиотекой. Вы неправильно используете объявленные в хедере функции. Судя по сообщениям об ошибке, конструктор класса Selenium помимо строки получает еще и bool.
    Ответ написан
  • Как из этого сделать нормальную функцию?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Чтобы именно в таком виде отобразить вам нужен обход в ширину.

    Заводите очередь, положите в нее корень дерева. Потом в цикле, пока очередь не пуста, берете из нее элемент, выводите, и кладете в очередь его детей. Если надо разделить по уровням глубины, то надо вместе с указателем на элемент класть в очередь его глубину. Например, кладите в очередь std::pair. Или заведите 2 очереди и работайте с ними параллельно.

    На C++ можно или использовать std::queue, или просто std::vector. Во втором случае добавление в очередь будет просто push_back, а для удаления из очереди заведите счетчик, который указывает на голову. При изъятии элемента просто сдвигайте этот счетчик.
    Ответ написан
    Комментировать
  • В каком виде изобразить такую программу?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    В каком виде? В виде программы. Или в виде блок схемы.
    Ответ написан
  • Что не так с решением задачи?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Ваша идея не верна.

    Надо порисовать на бумажке и убедится, что из строки S вы можете получить только строки вида S(k1)S(k2)S(k3)...S(kn), Где S(x) - x-ый префикс строки S, т.е. первые x символов.
    При этом k1 >= k2, ... k1>= kn.

    При чем все строки такого вида можно получить.

    Доказывается по индукции по количеству операций. Изначально строка именно такого вида (k1=длина строки). После каждой операции, эта строка сколько-то раз копируется и как-то обрезается по длине. Поэтому любая полученная строка будет такого вида. И каждую такую строку можно построить: применяйте операции с k равными k1, k1+k2, k1+k2+k3... Так вы за n операций соберете все префиксы по одному.

    Теперь, раз вам во входном файле задана подстрока результата, вам надо проверить, что эта строка состоит из подстроки S, за которой идут префиксы строки S.

    Так, пример из условия bcabc состоит из подстроки bc и одного префикса abc.

    В задаче не очень большие ограничения, поэтому можно в тупую для каждой подстроки i..j результирующей строки определить, является ли она суффиксом первой строки. Также для каждой подстроки первой строки можно определить, является ли она префиксом второй строки.

    Потом нужно построить граф: из позиции 0 сделайте ребра во все позиции, где заканчивается какая-то подстрока первой строки в начале второй. Из позиции i>0 сделайте ребра во все позиции j такие, что подстрока i...j префикс первой строки.

    Потом, если в этом графе есть путь из вершины 0 в вершину с номером длины второй строки - YES. Иначе - NO.

    Это решение за квадрат, если подстроки искать не совсем в тупую: для проверки на суффикс внешний цикл ведите по правому концу, а внутренний - по левому концу убывая. Так можно сдвигать второй указатель, пока строка остается суффиксом, проверяя каждый раз только один символ. Похожим образом можно проверять все подстроки на совпадение с префиксом.
    Ответ написан
    Комментировать
  • Почему выделение памяти под строку выглядит не по шаблону?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Когда вы выделяете массив на n элементов типа T вам надо n*sizeof(T) памяти.

    Когда вы выделяете строку на n символов вам надо n+1 байт памяти. Потому что каждый символ занимает 1 байт, и вам нужно место под n символов и под завершающий символ '\0'. В C/C++ строки всегда завершаются нулевым символом. Надо про него всегда помнить и выделять под него место.
    Ответ написан
  • Как решить вечную проблему со сбором данных?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Гугл формы. В визуальном редакторе создается опрос - выбираются типы возможных ответов (вплоть до регулярок). Можно запрашивать некоторые данные в зависимости от предыдущих ответов. В итоге все это добро автоматически собирается в гугл spreadsheet.

    При этом даже не надо чтобы у всех сотрудников был гугловый е-мейл. Правда тогда нет защиты от дураков и они могут несколько раз отвечать и вообще анонимно всякую дичь писать.

    Если в компании есть gsuite - то так еще проще, но он не обязателен.
    Ответ написан
    Комментировать
  • Как организовать работу двух динамических массивов используя malloc?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Надо так:
    void arr_cr( int ***a , int n, int m){
        int i,j;
        a*=(int **)malloc(n*sizeof(int *));
        for( i=0 ; i < n ; i++)
            (a*)[i]=(int *)malloc(m*sizeof(int));
    }


    У вас везде напутано - вы создаете n/10/10 int*, а потом заполняете их циклом до m/8/12. Выделили 10 элементов, заполнили 8 или 12. Непорядок.

    И когда вы выделяете память под строку массива в цикле, вы должны не sizeof(int) памяти выделять, а в m/8/12 раз больше - вы же под всю строку память выделять должны.

    edit: еще не заметил, что массив передается по значению. Надо передавать int***.
    Ответ написан
    Комментировать
  • При попытке перевернуть число выдает левые значения. Откуда?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Число y переполняется. Вы записываете двоичную запись десятичными цифрами. в uint16_t помещаются число до 65535. Соответственно, если вы постараетесь 100000 туда записать, оно переполнится. Т.е. ваша программа не работает при x>=32.

    Вместо запихивания довичной записи в десятичное число вы должны биты записывать в строку std::string. Потом ее перед выводом развернуть.
    Ответ написан
    Комментировать
  • Почему скорость битовых операций отличается в 1000 раз?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Скорее всего, обращение к массиву тормозит. Там, видимо, еще и проверки на попадание в границы массива происходят.

    Если вы место обращения к массиву будете делать currentByte & (1 << (7-j)), то должно работать почти также быстро.

    P.s. и вообще у вас какой-то странный выбор порядка битов. Обычно сдвигают вправо, к младшему биту. Тогда вместо маски будет тупо 0x1.
    Ответ написан
  • Как добавить в один вектор элемент из другого вектора под определенным индексом?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Что пытается сделать ваш код - совершенно непонятно. Подозреваю, что ассерт может происходить из-за кривых прочитанных из файла значений Index. с26451 - это предупреждение, а не ошибка, но по одному номеру сказать сложно. Приведите весь текст предупреждения. Попробуйте тип Index поменять на size_t, может уберет его.

    Ответ на вопрос в заголовке - vector::insert

    Если хотите добавить x после k элементов в вектор a, то сделайте
    a.insert(a.begin()+k, x);
    Ответ написан
    7 комментариев