• Сколько существует различных уникальных подпоследовательностей из последовательности цифр длиной N?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    На C++
    #include <iostream>
    #include <vector>
    #include <set>
    #include <time>
    
    std::set<std::string> subSeqs;
    struct _element {
        char digit;
        int  count;
    };
    std::vector<_element> elemSeq;
    
    void recurse(std::vector<_element>::iterator elemRest, std::string subSeqHead) {
      bool fin = (elemRest+1 == elemSeq.end());
        for (int i = 0; i <= elemRest->count; i++, subSeqHead += elemRest->digit)
            if (fin)
                subSeqs.insert(subSeqHead);
            else
                recurse(elemRest+1, subSeqHead);
    }
    
    void main(void)
    {
      int i;
      _element element;
      std::string initialSeq = "1234567890123";
    
        std::cout << "Initial sequence: " << initialSeq << "\n";
    
        clock_t start = clock();
    
        element.digit = initialSeq[0];
        element.count = 1;
        for (i = 1; i < initialSeq.length(); i++) {
            if (element.digit == initialSeq[i])
                element.count++;
            else {
                elemSeq.push_back(element);
                element.digit = initialSeq[i];
                element.count = 1;
            }
        }
        elemSeq.push_back(element);
    
        recurse(elemSeq.begin(), "");
    
        clock_t finish = clock();
    
        i = 0;
        std::cout << "Elements: (";
        for (std::vector<_element>::iterator t = elemSeq.begin();
                                                    t != elemSeq.end(); t++) {
            if (i++ != 0)
                std::cout << ", ";
            std::cout << "{'" << t->digit << "', " << t->count << "}";
        }
        std::cout << ")\n";
        std::cout << subSeqs.size()-1 << " unique subsequences\n";
        std::cout << "Calculation time " << finish-start << " clicks, ";
        std::cout << ((float)(finish-start))/CLOCKS_PER_SEC << " sec\n";
    /*     for (std::set<std::string>::iterator t = subSeqs.begin();
                                                    t != subSeqs.end(); t++) {
            std::cout << *t << "\n";
        } */
    }

    Результаты:
    Initial sequence: 8246
    Elements: ({'8', 1}, {'2', 1}, {'4', 1}, {'6', 1})
    15 unique subsequences
    Calculation time 0 clicks, 0 sec
    ================================================================
    Initial sequence: 88885
    Elements: ({'8', 4}, {'5', 1})
    9 unique subsequences
    Calculation time 0 clicks, 0 sec
    ================================================================
    Initial sequence: 12345678901234567890
    Elements: ({'1', 1}, {'2', 1}, {'3', 1}, {'4', 1}, {'5', 1}, {'6', 1}, {'7', 1},
     {'8', 1}, {'9', 1}, {'0', 1}, {'1', 1}, {'2', 1}, {'3', 1}, {'4', 1}, {'5', 1},
     {'6', 1}, {'7', 1}, {'8', 1}, {'9', 1}, {'0', 1})
    1043455 unique subsequences
    Calculation time 4383 clicks, 4.383 sec
    ================================================================
    Initial sequence: 11223344556677889900
    Elements: ({'1', 2}, {'2', 2}, {'3', 2}, {'4', 2}, {'5', 2}, {'6', 2}, {'7', 2},
     {'8', 2}, {'9', 2}, {'0', 2})
    59048 unique subsequences
    Calculation time 187 clicks, 0.187 sec
    Ответ написан
    3 комментария
  • Сколько существует различных уникальных подпоследовательностей из последовательности цифр длиной N?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Несколько сократить количество вариантов при переборе можно сгруппировав подряд идущие одинаковые цифры. Скажем для (1 1 1 2 1 1) получим исходный набор ((1, 3), (2, 1), (1, 2)). После этого рекурсивно его перебираем.
    функция рекурсия(набор, результат) {
        если набор пуст {
            если результат уникален { 
                добавить результат в список уникальных
            }
        }
        ((цифра, количество), следующий_набор) = набор;
        для i от 0 до количество {
            рекурсия(следующий_набор, результат+(цифра i раз));
        }
    }
    рекурсия(исходный_набор, '');

    Первый шаг рекурсии даст варианты '', '1', '11' или '111'. Второй шаг к каждому из них допишет '' или '2'. Третий шаг к каждому из 8 получившихся вариантов допишет '', '1' или '11'. То есть вместо 26 = 64 вариантов для поиска уникальности получим 4*2*3 = 24.
    Чем больше будет в исходной последовательности групп подряд идущих одинаковых цифр тем больше будет выигрыш. Если таких групп нет, то упрёмся в полный перебор.
    Ответ написан
    1 комментарий
  • Сколько существует различных уникальных подпоследовательностей из последовательности цифр длиной N?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Полный перебор можно существенно сократить не перебирая конкретные перестановки цифр: если выбраны цифры di, i = 1...m, среди которых есть группы одинаковых, с количеством цифр в каждой из этих групп cj, j = 1...k, то из этих цифр можно составить gif.download?%5Cfrac%7Bm%21%7D%7B%5Cprod разных чисел. Это число не зависит от конкретно выбранных цифр, только от размера групп одинаковых цифр, т.е. его значение можно посчитать раз и закешировать. Остаётся перебрать все выборки по m цифр из исходных n, их gif.download?%5Cfrac%7Bn%21%7D%7Bm%21%28, и для каждой из них, подсчитав размеры групп одинаковых цифр, определить, сколько можно составить разных чисел.
    Ответ написан
    2 комментария
  • Сколько существует различных уникальных подпоследовательностей из последовательности цифр длиной N?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В общем случае получается только полный перебор, количество всех подпоследовательностей = 2n-1
    Ответ написан
    4 комментария
  • Как обмануть тарифное время?

    okwinza
    @okwinza
    PHP Developer
    Тарификация происходит на стороне сервера провайдера, по его часам.
    Манипуляции с локальным устройством не имеют смысла.
    Ответ написан
    Комментировать
  • Как средствами PHP защититься от накрутки кол-ва загрузок файла?

    @kaasius
    А файло отдается как?
    Исходя из предположения, что с одного ip нет большого смысла скачивать файл более одного раза, то ограничивающий фактор будет ip. Далее делаем так:
    На фронт nginx, и делаем локейшн, в котором лежат файлы.
    location ^~ /user_files { # Это где реально лежат файлы
            internal;
            root /path/to/folder;
    }
    location ^~ /userfiles { # Это то, куда указывают ссылки на сайте
            proxy_pass  http://127.0.0.1:80;
    }


    Обрабатываете локейшн /userfiles в php и отдаете заголовки X-Accel-Redirect, чтобы статику отдавал энджи.

    Дальше, как считать.

    Если стоит memcache - делаем add($fileid.$ip,1) - если ключ уже установлен, add вернет false, и счетчик увеличивать не надо, если не установлен - надо увеличить счетчик. Ключ при этом установится. Счетчик увеличиваем соответственно так: inc("counter/".$fileid,1)

    Если стоит redis - все очень похоже. Делаем setnx($fileid.$ip,1) - если ключ установлен, вернет false. Если нет - ключ установится. Счетчик увеличиваем incr("counter/".$fileid,1). Но redis так же может помочь сильно сэкономить память. Для этого надо использовать не строки, а хеши. То есть стейт храним как hsetnx($fileid,$ip,1). А счетчик в этом случае храним как hincrby("counters",$fileid,1). Это даст перед мемкешем следующие преимущества:
    1. Драматическая экономия памяти. Хеши c короткими ключами и значениями весьма эффективно расходуют память.
    2. Сайд-эффект - очень просто посмотреть, с каких ip загружали файл - hgetall($fileid). Если еще немного модифицировать алгоритм так: hincrby($fileid,$ip,1) - будем получать на выходе целое значение - количество закачек с этого ip - так можно попалить накрутчиков и просто банить их по ip.
    3. Сайд-эффект - очень просто получить таблицу всех счетчиков файлов - hgetall("counters").

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

    Если ограничивать по пользователям (кукам), что на мой взгляд не очень, то все делается ровно так же, только вместо ip используем id, который записан в сессии. Тогда использовать хеши для хранения состояния не удачная мысль - надо хранить в строках, и ставить им expire - время жизни сессии, или, там, сутки - как угодно.
    Ответ написан
    1 комментарий
  • Как средствами PHP защититься от накрутки кол-ва загрузок файла?

    dvachek
    @dvachek
    Храните лог ip:state в memcache - нулевая нагрузка, 100% результат. Лог можно чистить каждые 24 ч.
    Ответ написан
    Комментировать
  • Как средствами PHP защититься от накрутки кол-ва загрузок файла?

    Можете базу заменить на Redis (для хранения ip и данных по загрузкам), будет быстрей и меньше нагрузки.

    Еще как вариант можете использовать Evercookie, чтобы пользователям было напряжней чистить куки, а для отсечения большей части ботов установить test_cookie для nginx. Большею часть накруток думаю можно будет скинуть. Матерые с ботами эмулирующими браузеры будет отсеить сложней, но если проявить смекалку, то тоже можно устроить им проблем.
    Ответ написан
    2 комментария
  • Как в игре "Жизнь" определить предыдущее состояние клеток по текущему? (Одномерное поле)?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Верно так:
    // Инициализируем C, надо заменить на ввод исходных данных
    $C = array(1, 1, 1, 0, 0, 1, 1, 1, 0, 1);
    $N = count($C);
    
    // Добавляем в начало и конец нули
    array_unshift($C, 0);
    $C[] = 0;
    
    // Создаём массив P, заполняем 0 и N+1 элементы нулями
    $P[0] = 0;
    $P[$N+1] = 0;
    
    // Заполняем чётные ячейки
    for ($i = 1; $i <= $N; $i += 2)
        $P[$i+1] = $P[$i-1] ^ $C[$i];
    
    // Заполняем нечётные ячейки
    if (($N&1) == 0) {
        // Вариант с чётным количеством ячеек
        for ($i = $N; $i >= 1; $i -= 2)
            $P[$i-1] = $P[$i+1] ^ $C[$i];
    } else {
        // Вариант с нечётным количеством ячеек
        $P[1] = 0;
        for ($i = 1; $i <= $N; $i -= 2)
            $P[$i-1] = $P[$i+1] ^ $C[$i];
    }
    
    // Выводим результат
    for ($i = 1; $i <= $N; $i++)
        print $P[$i];

    Получаем 0110100111.
    Проверяем, (0110100111) даёт по правилам (1110011101)
    Ответ написан
    1 комментарий
  • Как в игре "Жизнь" определить предыдущее состояние клеток по текущему? (Одномерное поле)?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Обозначим текущее состояние как C[1..N], предыдущее как P[1..N], С[0] = P[0] = C[N+1] = P[N+1] = 0 - клетки за пределами поля.
    На текущем шаге клетка жива тогда и только тогда, когда на предыдущем шаге у неё был ровно один сосед, то есть C[i] = P[i-1] xor P[i+1] => P[i+1] = C[i] xor P[i-1].
    1. P[0] = 0, C[1] известна => P[2] = P[0] xor C[1]. Теперь, зная P[2] можно найти P[4] = P[2] xor C[3] или в общем случае:
    для i от 1 до N с шагом 2
        P[i+1] = P[i-1] xor C[i];
    Получили все предыдущие значения чётных ячеек.

    2a. Для чётных N обратным ходом можно восстановить нечётные ячейки:
    для i от N до 1 с шагом -2
        P[i-1] = P[i+1] xor C[i];

    2b. Для нечётных N однозначного решения нет. В зависимости от значения P[1] будет получен один из двух вариантов решения:
    P[1] = 0; // или 1
    для i от 2 до N с шагом 2
        P[i+1] = P[i-1] xor C[i];
    Ответ написан
    7 комментариев
  • (C++) Наследуемый Singleton класс. Как реализовать?

    Trrrrr
    @Trrrrr
    один из вариантов через тимплейты:
    Что то вроде:
    #include <iostream>
    template <class T> class Singleton 
    {
    protected:
    	Singleton(){};
    	Singleton(const Singleton&);
    
    public:
    	static T& GetInstance()
    	{
    		static T instance;
    
    		return instance;
    	}
    };
    
    class AnotherSingleton : public Singleton<AnotherSingleton>
    {
    private:
    	int i;
    
    public:
    	void SomeFunc()
    	{
    		i = 10;
    		std::cout<< i;
    	}
    };
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	AnotherSingleton::GetInstance().SomeFunc();
    	return 0;
    }

    Это примерный код, его можно улучшить.

    Кстати в с++11 такой код уже будет являться тред сейфовым.

    На самом деле такой класс можно очень хорошо улучшить, но для примера подойдет.
    Ответ написан
    5 комментариев
  • Как средствами C++ создать экземпляр класса, видимого из методов другого класса?

    @hsc
    full stack python back-end developer
    Строго говоря, использование глобальных переменных в С++ встречается редко. Это допустимо, но по большей мере для обеспечения совместимости с С. В С++ для передачи контекста используют другие приемы, например "передачу по указателю" (ниже). Стоит также сказать, что глобальные переменные сопряжены с кое-какими нюансами, например, могут возникнуть проблемы с последовательностью инициализации.

    Но, судя по Вашему вопросу, Вам не нужны глобальные переменные. Достаточно будет кода на подобие этого:

    /* 
     * gameinstancehandler.h 
     */
    
    class GameInstanceHandler{
    public:
        GameInstanceHandler(CGameHud *instance):
            mInstance(instance){}
    
    private:
        CGameHud *mInstance;
        // something other here
    }


    #inlucde <gameinstancehandler>
    
    int main(int argc, char **args){
        CGameHudInstance *gameHub = new CGameHud(argc, args);
        GameInstanceHandler *handler = new GameInstanceHandler(gameHub);
    
        return 0;
    }


    Здесь контекст передается по указателю. Объекты, поведение которых зависит от других, уже созданных объектов, просто получают указатели на них в конструкторе, сохраняют его "у себя" и взаимодействуют с ними через сохраненную копию указателя.

    P.S. Поскольку вопрос новичковый, позволю себе дать еще один совет: во время объявления указателя пишите звездочку перед идентификатором, а не после типа.
    int *a; // хорошо, a — это указатель.
    int* b; // плохо, но допустимо.
    int* c, d; // совсем плохо, c — указатель на int, d — просто переменная типа int.
    
    int *e, *f; // при такой же записи все понятно сразу.
    Ответ написан
    Комментировать
  • (C++, GLUT) Рисование круга. Из-за чего несоответствие между радиусом и позицией?

    WNeZRoS
    @WNeZRoS
    glVertex2f(posX + cos(_tmpPoint) * (radius / 10), 
                    posY + sin(_tmpPoint) * (radius / 10));

    У вас в вычислении координат используется не сам радиус, а радиус делённый на 10.
    Ответ написан
    1 комментарий
  • Как удалить все строки из таблицы, кроме последних N?

    @okashirin
    оставляет пять последних записей, при условии, что id идут по порядку
    DELETE FROM gangs_actions
    WHERE gangs_actions_id < (SELECT MAX(gangs_actions_id) - 5 FROM (SELECT * FROM gangs_actions) tmp)


    а это твой запрос, только он будет работать
    DELETE FROM gangs_actions
    WHERE gangs_actions_id <= (
    SELECT gangs_actions_id FROM (SELECT * FROM gangs_actions) as tmp
    ORDER BY gangs_actions_id DESC
    LIMIT 5,1
    )
    Ответ написан
    1 комментарий
  • Как удалить все строки из таблицы, кроме последних N?

    Snowly
    @Snowly
    Нужно использовать IN / NOT IN.
    Так удалятся все записи из подзапроса.

    DELETE FROM `gangs_actions`
    WHERE `gangs_actions_id` IN (
      SELECT `gangs_actions_id` FROM `gangs_actions` 
      ORDER BY `gangs_actions_id` DESC
      LIMIT 5
    )
    Ответ написан
    1 комментарий
  • Как удалить все строки из таблицы, кроме последних N?

    База то какая?
    Решение в общем виде - временная таблица. Выберите в неё айдишники объектов которые нужно удалить, и потом напишите условие с выборкой уже из неё, а не из обновляемой таблицы.

    По синтаксису или сами смотрите, или пишите название БД, подскажу.
    Ответ написан
    1 комментарий
  • Running several name-based web sites on a single IP address

    xaker1
    @xaker1
    NameVirtualHost *:80
    <VirtualHost *:80>
    DocumentRoot /var/www/testsite.local/htdocs
    ServerName testsite.local
    # Other directives here
    </VirtualHost>
    <VirtualHost *:80>
    DocumentRoot /var/www/site.com
    ServerName site.com
    # Other directives here
    </VirtualHost>

    При заходе по IP должнен открываться первый VirtualHost, ЕМНИП.
    А домен в прописывать не надо, там прописывается IP:порт.
    Ответ написан
    4 комментария
  • Как реализовать разделение на домены на одном IP?

    hell0w0rd
    @hell0w0rd
    Просто разработчик
    Разберитесь в nginx.
    Там конфиги в разы проще, статику он вроде как отдает лучше, php-fpm работает нормально, что еще для жизни нужно?)
    nkt.me/configure-vps-on-ubuntu-12-04/ - писал заметку, как сконфигурировать ubuntu на vps-ке, там есть раздел про первичную настройку nginx.
    Плюс на nginx.org по почти каждому модулю есть русская документация.
    Ответ написан
    1 комментарий
  • Как реализовать разделение на домены на одном IP?

    @Nc_Soft
    гуглить по Apache Virtual Host
    Ответ написан
    Комментировать