Ответы пользователя по тегу C++
  • Как перевести строку бинарного файла в UTF8?

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Hiroshima, Что выдает компилятор при попытке скомпилировать, можете прочитать и скопировать?
    Ответ написан
    Комментировать
  • Почему C/C++ проекты очень долго компилируются?

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

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

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Уберите проверку на совпадение внутри while. Присваивайте границам интервала mid, а не mid+1 или -1.
    Ответ написан
    Комментировать
  • Как связать динамическую библиотеку с кодом 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 Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Число y переполняется. Вы записываете двоичную запись десятичными цифрами. в uint16_t помещаются число до 65535. Соответственно, если вы постараетесь 100000 туда записать, оно переполнится. Т.е. ваша программа не работает при x>=32.

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

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

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

    Если хотите добавить x после k элементов в вектор a, то сделайте
    a.insert(a.begin()+k, x);
    Ответ написан
    7 комментариев
  • Почему зависает при вызове connect WSA?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    А зачем вы делаете ptr = result->ai_next;?

    В документации есть пример, как обрабатывать результат:
    for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) {

    Наверняка, оно у вас возвращает одну запись, а вы сразу берете следующую, которой не существует. И дальше разыменовываете нулевой указатель ptr.
    Ответ написан
  • Что не так с алгоритмом создания максимального числа из исходного, используя двоичную СС?

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

    Тут есть 2 куска 1110. Но за первым идет "010", а за вторым "011". Начинать со второго - выгоднее.

    В этой задаче очень маленькие ограничения - можно полностью перебирать все возможные числа и брать максимальное. Можно даже не переводить в двоичную систему, а воспользоваться битовыми операциями.
    Когда вы узнали, сколько битов в числе, то самый младший бит x можно получить как x&1. Сдвинуть все биты числа на одну позицию вправо - это x >> 1. При этом младший бит пропадает. Чтобы вставить новый бит b слева нужно сделать x | (b << k) - тут k - номер позиции этого бита, считая с 0.

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

    И так, для развития: Если бы ограничения были слишком большие (число в десятки тысяч бит), то тут пришлось бы применять умные строковые алгоритмы. Это была бы задача на поиск лексикографически максимального циклического сдвига. Решается с помощью суффиксного дерева, суффиксного массива или суффиксного автомата.
    Ответ написан
    2 комментария
  • Что делает в данной ситуации yield()?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Читайте документацию.

    Yield говорит планировщику, что сейчас хорошо бы текущий поток вытеснить.

    Зачем он тут нужен? В сильно конкурентной среде это позволит другим потокам что-то доделать и сократить накладные расходы на попытки захватить мьютекс. Но вообще говоря тут он не нужен. И вообще надеяться на yield - плохая идея. Планировщик может его и вообще проигнорировать.
    Ответ написан
    Комментировать
  • Почему не работает перегрузка класса?

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

    Если же у вас указатель, к которому вы применяете операцию ++, то вызывается не перегруженный оператор, а используется арифметика указателей - просто сдвигается адрес в памяти на следующий.

    Попробуйте (*p)++.
    Ответ написан
    2 комментария
  • Как убрать нілики из ответа даного кода, ответ правильний только нулі виводить перед ответом?

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

    Но вы же, видимо, его и отредактировали, а теперь спрашиваете опять. Ответ там уже был мной дан.
    Ответ написан
    4 комментария
  • Как убрать нули из ответа?

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

    Надо циклом найти в массиве самую последнюю не нулевую цифру и выводить с нее.

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

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

    Уберите ненужные переменные. Еще, зачем у вас там i % columns?

    Похоже, надо в output.txt выводить, а не в stdout.

    Еще, советую выводить перевод строки всегда, и не пропускать его на последней строке вывода.

    Чтобы не было проблем с пробельными символами - читайте в двух вложенных циклах до rows и columns по одному char (а не string до eof). Это и ввод упростит и сделает его более безопасным ко всяким артефактам в тестах.
    Ответ написан
  • Почему функция не возвращает указатель на объект класса?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    if (!a)	{
        a->s = s;
        cout << 5;
        return a; //ошибка, не возвращает указатель на обьект класса
    }


    У вас тут a==NULL - пустой указатель. Вы пытаетесь его члену что-то присвоить (то. что программа не упала - вам дико повезло). потом вы возвращаете этот же пустой указатель.

    Вам надо создавать новый объект через new в этом случае.
    Ответ написан
    3 комментария