亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? lzari.cpp

?? 非常好用的五子棋游戲源碼
?? CPP
字號:
// Created:09-23-98
// By Jeff Connelly

// LZARI (LZSS with arithmetic) compression/decompression

// Original code written by Haruhiko Okumura in
// ORIGSRC\LZARI.C.  You can use, distribute, and modify
// this program freely.

#include "stdafx.h"
#define EXPORTING
#include "comprlib.h"
#include "lzari.h"
#include <string.h>
#include <ctype.h>

static unsigned long textsize = 0, codesize = 0;

// *********** BIT I/O *********
// Write one bit (bit can be 0 or 1)
static void PutBit (bool bit)
{
    static unsigned int buffer = 0, mask = 128;
    if (bit)
        buffer |= mask;
    if ((mask >>= 1) == 0)
    {
        write_byte (buffer);
        buffer = 0;
        mask = 128;
        ++codesize;
    }
}

// Send remaining unsent bits
static void FlushBitBuffer ()
{
    int i;
    for (i = 0; i < 7; ++i)
        PutBit(0);
}

static bool GetBit ()
{
    static unsigned int buffer, mask = 0;
    if ((mask >>= 1) == 0)
    {
        buffer = read_byte();
        mask = 128;
    }
    return ((buffer & mask) != 0);
}

// ********** LZSS with multible binary trees ***********
#define N           4096        // size of ring buffer
#define F             60        // upper limit for match_length
#define THRESHOLD      2        // encode string into position, length
                                // pair if match_length is greater than this
#define NIL            N        // index for root of binary search trees

static unsigned char text_buf[N + F - 1]; // Ring buffer of size N with extra
                                        // F - 1 bytes for string comparison
static int match_position, match_length;       // Length of longest match
static int lson[N + 1], rson[N + 257], dad[N + 1]; // Children and parents

// Initalizes trees
static void InitTree()
{
    int i;
    // For i = 0 to N - 1, rson[i] and lson[i] will be the right
    // and left children of node i.  These nodes do not need to be
    // initalizes.  dad[i] is parent of node i.  Initalizes to
    // NIL (defined as N) which means 'not used.'

    // For i = 0 to 255, rson[N + i + 1] is root of strings that begin
    // with character i.  These are initailzed to NIL.  256 trees.

    for (i = N + 1; i <= N + 256; i++)
        rson[i] = NIL;           // root
    for (i = 0; i < N; i++)
        dad[i] = NIL;            // node
}

// Inserts string of length F, text_buf[r..r + F - 1] into one of the
// trees (text_buf[r]th tree) and sets the longest match position and
// length (match_length and match_position).  If match_length == F, then
// removes the old node in favor of the new node because the old one will be
// deleted sooner.  r is the both tree node and position in the buffer.
static void InsertNode (int r)
{
    int i, p, cmp, temp;
    unsigned char* key;

    cmp = 1;
    key = &text_buf[r];
    p = N + 1 + key[0];
    rson[r] = lson[r] = NIL;
    match_length = 0;
    while (true)
    {
        if (cmp >= 0)
        {
            if (rson[p] != NIL)
                p = rson[p];
            else
            {
                rson[p] = r;
                dad[r] = p;
                return;
            }
        } else {
            if (lson[p] != NIL)
                p = lson[p];
            else
            {
                lson[p] = r;
                dad[r] = p;
                return;
            }
        }
        for (i = 1; i < F; i++)
            if ((cmp = key[i] - text_buf[p + i]) != 0)
               break;
        if (i > THRESHOLD)
        {
            if (i > match_length)
            {
                match_position = (r - p) & (N - 1);
                if ((match_length = i) >= F)
                    break;
            } else if (i == match_length) {
                if ((temp = (r - p) & (N - 1)) < match_position)
                    match_position = temp;
            }
        }
    }
    dad[r] = dad[p];
    lson[r] = lson[p];
    rson[r] = rson[p];
    dad[lson[p]] = r;
    dad[rson[p]] = r;
    if (rson[dad[p]] == p)
        rson[dad[p]] = r;
    else
        lson[dad[p]] = r;
    dad[p] = NIL;    // remove p
}

// Remove node p from the tree
static void DeleteNode (int p)
{
    int q;
    if (dad[p] == NIL)
        return;           // not in tree
    if (rson[p] = NIL)
        q = lson[p];
    else if (lson[p] == NIL)
        q = rson[p];
    else
    {
        q = lson[p];
        if (rson[q] != NIL)
        {
            do
            {
                q = rson[q];
            } while (rson[q] != NIL);
            rson[dad[q]] = lson[q];
            dad[lson[q]] = dad[q];
            lson[q] = lson[p];
            dad[lson[q]] = q;
        }
        rson[q] = rson[p];
        dad[rson[p]] = q;
    }
    dad[q] = dad[p];
    if (rson[dad[p]] == p)
        rson[dad[p]] = q;
    else
        lson[dad[p]] = q;
    dad[p] = NIL;
}

// ***************** Arithmetic Compression ************
// The book
//     I. E. Witten, R. M. Neal, and J. G. Cleary,
//         Communications of the ACM, Vol. 30, pp. 520-540 (1987)
// explains about arithmetic compression, in case you are not familer with
// it.

#define M       15
// Q1 (== 2 to the M) must be large, but not large as 4 * Q1 * (Q1 - 1)
// overflows.
#define Q1 (1UL << M)
#define Q2 (2 * Q1)
#define Q3 (3 * Q1)
#define Q4 (4 * Q1)
#define MAX_CUM (Q1 - 1)
#define N_CHAR (256 - THRESHOLD + F)    // Char code: 0, 1, ..., N_CHAR - 1

static unsigned int low = 0, high = Q4, value = 0;
static int shifts = 0;     // counts for magnifying low and high around Q2
static int char_to_sym[N_CHAR], sym_to_char[N_CHAR + 1];
static unsigned int sym_freq[N_CHAR + 1];     // frequency of symbols
static unsigned int sym_cum[N_CHAR + 1];      // cumulative freq for symbols
static unsigned int position_cum[N + 1];      // cumulative freq for positions

// Initalize model
static void StartModel ()
{
    int ch, sym, i;

    sym_cum[N_CHAR] = 0;
    for (sym = N_CHAR; sym >= 1; sym--)
    {
        ch = sym - 1;
        char_to_sym[ch] = sym;
        sym_to_char[sym] = ch;
        sym_freq[sym] = 1;
        sym_cum[sym - 1] = sym_cum[sym] + sym_freq[sym];
    }

    sym_freq[0] = 0;        // sentinal (!= sym_freq[1])
    position_cum[N] = 0;

    for (i = N; i >= 1; i--)
        // Empirical distribuation function (very tentative)
        position_cum[i - 1] = position_cum[i] + 10000 / (i + 200);
}

static void UpdateModel (int sym)
{
    int i, c, ch_i, ch_sym;

    if (sym_cum[0] >= MAX_CUM)
    {
        c = 0;
        for (i = N_CHAR; i > 0; i--)
        {
            sym_cum[i] = c;
            c += (sym_freq[i] = (sym_freq[i] + 1) >> 1);
        }
        sym_cum[0] = c;
    }
    for (i = sym; sym_freq[i] == sym_freq[i - 1]; i--)
        ;
    if (i < sym)
    {
        ch_i = sym_to_char[i];
        ch_sym = sym_to_char[sym];
        sym_to_char[i] = ch_sym;
        sym_to_char[sym] = ch_i;
        char_to_sym[ch_i] = sym;
        char_to_sym[ch_sym] = i;
    }
    ++sym_freq[i];
    while (--i >= 0)
        ++sym_cum[i];
}

// Output one bit followed by its complements
static void Output (bool bit)
{
    PutBit(bit);
    for (; shifts > 0; shifts--)
        PutBit(!bit);
}

static void EncodeChar (int ch)
{
    int sym;
    unsigned long range;

    sym = char_to_sym[ch];
    range = high - low;
    high = low + (range * sym_cum[sym - 1]) / sym_cum[0];
    low +=       (range * sym_cum[sym    ]) / sym_cum[0];
    while (true)
    {
        if (high <= Q2)
            Output (0);
        else if (low >= Q2)
        {
            Output(1);
            low -= Q2;
            high -= Q2;
        }
        else if (low >= Q1 && high <= Q3)
        {
            ++shifts;
            low -= Q1;
            high -= Q1;
        } else
            break;
        low += low;
        high += high;
    }
    UpdateModel(sym);
}

static void EncodePosition(int position)
{
    unsigned long range;

    range = high - low;
    high = low + (range * position_cum[position    ]) / position_cum[0];
    low +=       (range * position_cum[position + 1]) / position_cum[0];
    while (true)
    {
        if (high <= Q2)
            Output (0);
        else if (low >= Q2)
        {
            Output (1);
            low -= Q2;
            high -= Q2;
        }
        else if (low >= Q1 && high <= Q3)
        {
            ++shifts;
            low -= Q1;
            high -= Q1;
        } else
            break;
        low += low;
        high += high;
    }
}

static void EncodeEnd()
{
    ++shifts;
    if (low < Q1)
        Output (0);
    else
        Output (1);
    FlushBitBuffer();
}

static int BinarySearchSym (unsigned int x)
{
    int i, j, k;

    i = 1;
    j = N_CHAR;
    while (i < j)
    {
        k = (i + j) / 2;
        if (sym_cum[k] > x)
            i = k + 1;
        else
            j = k;
    }
    return i;
}

static int BinarySearchPos (unsigned int x)
{
    int i, j, k;

    i = 1;
    j = N;
    while (i < j)
    {
        k = (i + j) / 2;
        if (position_cum[k] > x)
            i = k + 1;
        else
            j = k;
    }
    return i - 1;
}

static void StartDecode ()
{
    int i;

    for (i = 0; i < M + 2; i++)
        value = 2 * value + GetBit();
}

static int DecodeChar()
{
    int sym, ch;
    unsigned long range;

    range = high - low;
    sym = BinarySearchSym((unsigned)
        (((value - low + 1) * sym_cum[0] - 1) / range));
    high = low + (range * sym_cum[sym - 1]) / sym_cum[0];
    low +=       (range * sym_cum[sym    ]) / sym_cum[0];
    while (true)
    {
        if (low >= Q2)
        {
            value -= Q2;
            low -= Q2;
            high -= Q2;
        } else if (low >= Q1 && high <= Q3) {
            value -= Q1;
            low -= Q1;
            high -= Q1;
        }
        else if (high > Q2)
            break;
        low += low;
        high += high;
        value = 2 * value + GetBit();
    }
    ch = sym_to_char[sym];
    UpdateModel (sym);
    return ch;
}

static int DecodePosition()
{
    int position;
    unsigned long range;

    range = high - low;
    position = BinarySearchPos((unsigned int)
        (((value - low + 1) * position_cum[0] - 1) / range));
    high = low + (range * position_cum[position    ]) / position_cum[0];
    low +=       (range * position_cum[position + 1]) / position_cum[0];
    while (true)
    {
        if (low >= Q2)
        {
            value -= Q2;
            low -= Q2;
            high -= Q2;
        } else if (low >= Q1 && high <= Q3) {
            value -= Q1;
            low -= Q1;
            high -= Q1;
        }
        else if (high > Q2)
            break;
        low += low;
        high += high;
        value = 2 * value + GetBit();
    }
    return position;
}

// ************ LZARI ************

void EXPORT lzari_encode ()
{
    int i, c, len, r, s, last_match_length;

    textsize = stream_size ();
    // Write 'textsize'
    write_byte ((unsigned char)(textsize & 0x000000FF));
    write_byte ((unsigned char)(textsize & 0x0000FF00));
    write_byte ((unsigned char)(textsize & 0x00FF0000));
    write_byte ((unsigned char)(textsize & 0xFF000000));

    codesize += sizeof(textsize);
    if (!textsize)
        return;         // Cannot compress nothing
    beginning_of_data();
    textsize = 0;
    StartModel();
    InitTree();
    s = 0; r = N - F;
    for (i = s; i < r; i++)
        text_buf[i] = ' ';     // Any frequently-occuring character will do
    for (len = 0; len < F && !end_of_data(); len++)
        text_buf[r + len] = c = read_byte();
    textsize = len;
    for (i = 1; i <= F; i++)
        InsertNode(r - i);
    InsertNode(r);
    do
    {
        if (match_length > len)
            match_length = len;
        if (match_length <= THRESHOLD)
        {
            match_length = 1;
            EncodeChar(text_buf[r]);
        } else {
            EncodeChar (255 - THRESHOLD + match_length);
            EncodePosition(match_position - 1);
        }
        last_match_length = match_length;
        for (i = 0; i < last_match_length &&
                !end_of_data(); i++)
        {
            c = read_byte();
            DeleteNode (s);
            text_buf[s] = c;
            if (s < F - 1)
                text_buf[s + N] = c;
            s = (s + 1) & (N - 1);
            r = (r + 1) & (N - 1);
            InsertNode(r);
        }
        while (i++ < last_match_length)
        {
            DeleteNode(s);
            s = (s + 1) & (N - 1);
            r = (r + 1) & (N - 1);
            if (--len)
                InsertNode(r);
        }
    } while (len > 0);
    EncodeEnd();
}

// Decode 'lzari_encode'd stream
void EXPORT lzari_decode()
{
    int i, j, k, r, c;
    unsigned long count;
    char tsize[4];

    // Read 'textsize'
    tsize[0] = read_byte();
    tsize[1] = read_byte();
    tsize[2] = read_byte();
    tsize[3] = read_byte();
    memcpy (&textsize, tsize, 4);   // Quick way to convert 4 chars to long
    if (!textsize)
        return;
    StartDecode();
    StartModel();
    for (i = 0; i < N - F; i++)
        text_buf[i] = ' ';
    r = N - F;
    for (count = 0; count < textsize; )
    {
        c = DecodeChar();
        if (c < 256)
        {
            write_byte(c);
            text_buf[r++] = c;
            r &= (N - 1);
            ++count;
        } else {
            i = (r - DecodePosition() - 1) & (N - 1);
            j = c - 255 + THRESHOLD;
            for (k = 0; k < j; k++)
            {
                c = text_buf[(i + k) & (N - 1)];
                write_byte(c);
                text_buf[r++] = c;
                r &= (N - 1);
                ++count;
            }
        }
    }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色呦呦一区二区三区| 欧美激情一区二区三区蜜桃视频 | 中文字幕亚洲一区二区va在线| 国产精品国产三级国产| 日本成人在线网站| 99久久国产综合精品麻豆| 91精品国产高清一区二区三区| 国产精品嫩草久久久久| 秋霞电影网一区二区| 欧日韩精品视频| 国产精品女同互慰在线看| 国产91丝袜在线18| 在线电影国产精品| 1000部国产精品成人观看| 国内成人精品2018免费看| 欧美日韩国产a| 亚洲三级电影全部在线观看高清| 久久国产精品99久久久久久老狼| 欧美体内she精高潮| 亚洲日本在线看| 丁香婷婷综合色啪| 精品av久久707| 免费在线看成人av| 欧美日韩亚洲国产综合| 一区二区三区四区在线免费观看| 丁香六月综合激情| 久久久久久久久久久久久女国产乱| 亚洲成人动漫一区| 欧美色欧美亚洲另类二区| 一区二区三区在线不卡| 一本大道av一区二区在线播放| 久久九九全国免费| 国内偷窥港台综合视频在线播放| 欧美一区二区三级| 日本va欧美va欧美va精品| 欧美一级高清片| 免播放器亚洲一区| 精品久久人人做人人爽| 捆绑调教美女网站视频一区| 欧美成人精品3d动漫h| 麻豆高清免费国产一区| 久久亚洲精精品中文字幕早川悠里| 精品一区二区三区蜜桃| 国产午夜亚洲精品不卡| 成人在线一区二区三区| 亚洲天堂2016| 欧美日韩一区视频| 热久久免费视频| 精品国产百合女同互慰| 国产精品888| 成人欧美一区二区三区| 91久久精品一区二区三区| 亚洲国产精品一区二区www在线| 8v天堂国产在线一区二区| 久久99九九99精品| 国产精品久久久久精k8| 色综合欧美在线视频区| 日韩精品电影在线| 国产亚洲成aⅴ人片在线观看 | 日韩极品在线观看| 久久久久久影视| 色中色一区二区| 全国精品久久少妇| 中文字幕不卡在线播放| 欧美少妇性性性| 久久99国产精品成人| 中文字幕在线不卡国产视频| 中文字幕高清不卡| 欧美三级乱人伦电影| 精品一区二区影视| 亚洲欧美日韩一区二区| 欧美一区日本一区韩国一区| 国产成人av电影在线观看| 一区二区三区四区视频精品免费 | 91免费看片在线观看| 日韩影视精彩在线| 国产精品欧美综合在线| 欧美私模裸体表演在线观看| 黑人巨大精品欧美一区| 亚洲免费毛片网站| 欧美精品一区男女天堂| 91国偷自产一区二区三区成为亚洲经典 | 奇米精品一区二区三区四区| 国产亚洲va综合人人澡精品| 欧洲人成人精品| 国产99精品在线观看| 久久精品国内一区二区三区| 亚洲欧美另类久久久精品| 精品国产免费人成在线观看| 在线观看精品一区| 国产91丝袜在线播放0| 免费三级欧美电影| 亚洲第一二三四区| 中文字幕在线一区二区三区| 欧美成人艳星乳罩| 欧美电影影音先锋| 91搞黄在线观看| 成人伦理片在线| 国产麻豆成人传媒免费观看| 午夜精品久久久| 亚洲综合久久av| 亚洲黄色免费电影| 亚洲人123区| 中文字幕在线不卡| 日本一区二区三区免费乱视频| 日韩三级电影网址| 欧美一区中文字幕| 91精品久久久久久久91蜜桃| 欧美午夜精品电影| 欧美色视频在线| 欧美性猛交一区二区三区精品| 成人午夜电影小说| 成人免费看片app下载| 国产一区二区免费看| 国内外精品视频| 国产一区二区不卡在线| 国产在线一区二区综合免费视频| 日韩精品电影在线观看| 蜜臀久久99精品久久久久久9| 奇米色777欧美一区二区| 久久电影网电视剧免费观看| 久久精品国产精品亚洲红杏| 蜜桃视频一区二区| 国模套图日韩精品一区二区| 51精品久久久久久久蜜臀| 欧洲av在线精品| 欧美精品精品一区| 日韩一区二区精品在线观看| 欧美不卡一区二区| 国产欧美视频一区二区三区| 欧美国产一区二区在线观看| 亚洲欧洲av在线| 亚洲一区二区中文在线| 男人操女人的视频在线观看欧美| 久久99这里只有精品| 国产成人在线影院| 色综合久久天天| 欧美日韩成人一区| 欧美变态tickle挠乳网站| 国产日本一区二区| 亚洲欧美另类久久久精品| 天天操天天综合网| 久久国产免费看| 99天天综合性| 欧美少妇一区二区| 久久久国际精品| 亚洲精品写真福利| 日韩高清在线不卡| 国产精品白丝av| 色悠悠久久综合| 精品乱人伦小说| 亚洲免费在线观看| 久久99这里只有精品| 91丨九色丨蝌蚪丨老版| 欧美福利电影网| 国产精品毛片久久久久久| 日韩高清一区二区| 99久久国产综合精品色伊| 欧美顶级少妇做爰| 国产精品激情偷乱一区二区∴| 亚瑟在线精品视频| 成人aa视频在线观看| 欧美大片在线观看一区二区| 国产精品久久久久久久裸模| 日本一区中文字幕| 91年精品国产| www久久久久| 日韩av不卡在线观看| av中文字幕在线不卡| 精品国产伦一区二区三区观看方式| 中文字幕亚洲一区二区va在线| 美女视频黄 久久| 欧美性xxxxx极品少妇| 亚洲国产岛国毛片在线| 琪琪一区二区三区| 在线精品观看国产| 综合色天天鬼久久鬼色| 国产毛片精品国产一区二区三区| 欧美日韩高清在线播放| 成人欧美一区二区三区小说| 国产精品影视天天线| 欧美日韩国产高清一区二区三区| 综合久久综合久久| 丁香六月综合激情| 久久这里只有精品6| 无码av中文一区二区三区桃花岛| 91同城在线观看| 亚洲欧美日韩在线| 99久久免费视频.com| 中文字幕第一区综合| 国产成人精品综合在线观看| 欧美tickling挠脚心丨vk| 日韩av一区二| 日韩一区二区视频| 美女尤物国产一区| 欧美一区二区人人喊爽| 视频一区二区国产| 制服丝袜亚洲网站| 喷水一区二区三区| 伊人色综合久久天天人手人婷|