Exemple #1
0
int main(void){
    char in[SIZE],out[SIZE],c;
    int i=0;
	while((c=getchar()) != '\n')
                       in[i++] = c;//input an char array including space
    in[i] = '\0';    
	expend(in,out);
	//printf("%s",in);
    printf("%s",out);
	system("pause");
	return 0; 
}
Exemple #2
0
LL solve() {
    init();
    for(int i = 0; i < n; ++i) {
        expend(str[i] - 'a');
        end[i] = last;
    }
    for(int i = 0; i < n; ++i) {
        for(State *p = end[i]; p && p->first == -1; p = p->par)
            p->first = i;
    }

    State *p = root;
    for(int i = 0, l = 0; i < n; ++i) {
        int w = str[i] - 'a';
        while(!p->go[w]) {
            p = p->par;
            l = p->val;
        }
        p = p->go[w];
        l++;
        while(p->first > i - l) {
            l--;
            if(p->par->val == l)
                p = p->par;
        }
        match[i] = l;
    }

    l = r = 0;
    for(int i = 0; i < n; ++i) {
        dp[i] = cost[str[i] - 'a'];
        if(i > 0) dp[i] += dp[i - 1];

        while(l != r && que[l] < i - match[i])
            ++l;
        if(l < r) {
            int j = que[l];
            dp[i] = std::min(dp[i], dp[j] + LL(i - j) * A + 2 * B);
        }
        while(l != r && getval(que[r - 1]) >= getval(i))
            --r;
        que[r++] = i;
    }
    return dp[n - 1];
}
int IndexFieldInc::addTerm(uint64_t termSign, uint32_t docId, uint8_t firstOcc)
{
    // 检查并删除idx_dict中超时的buffer空间
    idx_dict_free_oldblock(_bitmapDict);
    idx_dict_free_oldblock(_invertedDict);

    if(unlikely((_fullDocNum + 8*_maxIncBitmapSize) <= docId))
    {
        TWARN("inc reach max doc count limit!");
        return KS_SUCCESS;
    }
    if(_bitmapDict)
    {
        idict_node_t* pNodeBitmap = idx_dict_find(_bitmapDict, termSign);
        if(pNodeBitmap)
        {
            bitmap_idx1_unit_t* pIncBitmap = (bitmap_idx1_unit_t*)pNodeBitmap;
            uint64_t * pBitmap =  (uint64_t*)(_pIncMemManager->offset2Addr(pIncBitmap->pos));
            pBitmap -= _fullDocNum / 64;
            pBitmap[docId / 64] |= bit_mask_tab[docId % 64];
            pIncBitmap->doc_count++;
            pIncBitmap->max_docId = docId;
            if (_bitmapDict->syncMgr) {
                IndexFieldSyncManager * pSyncMgr = (IndexFieldSyncManager *) _bitmapDict->syncMgr;
                pSyncMgr->putIdxDictNode(pNodeBitmap);
                pSyncMgr->syncToDisk();
            }
        }
    }
    inc_idx2_header_t* head = NULL;

    // 确定新的2级索引单元的写入位置
    idict_node_t* pNode = idx_dict_find(_invertedDict, termSign);

    if(pNode == NULL) { // 没有这个token, 申请一个新的block
        int32_t pageSize = getPageSize(0, 0);
        uint32_t off  = 0;
        if(_pIncMemManager->makeNewPage(pageSize, off) < 0) {
            return KS_ENOMEM;
        }
        char* buf = _pIncMemManager->offset2Addr(off);
        head = (inc_idx2_header_t*)buf;
        head->pageSize = _pIncMemManager->size(off);
        head->endOff = sizeof(inc_idx2_header_t);
        head->zipFlag = 0;

        idict_node_t node = {0L, 0, 0, 0, 0};
        node.sign = termSign;
        ((inc_idx1_unit_t*)&node)->pos = off;
        if (0 != idx_dict_add(_invertedDict, &node)) {
            TWARN("add token %lu to idx1 dict failed", node.sign);
            return KS_EFAILED;
        }
        pNode = idx_dict_find(_invertedDict, termSign);
    }

    if(NULL == pNode) {
        TWARN("add token %lu to idx1 dict failed", termSign);
        return KS_EFAILED;
    }

    // 获取头信息,定位到空白内存处
    inc_idx1_unit_t* pind1 = (inc_idx1_unit_t*)pNode;
    char* begin = _pIncMemManager->offset2Addr(pind1->pos);
    head = (inc_idx2_header_t*)begin;
    char* end = begin + head->pageSize;
//    begin = _pIncMemManager->offset2Addr(head->endOff);
    begin += head->endOff;

    uint32_t docCount = getDocNumByEndOff(head->endOff, head->zipFlag);
    if (unlikely(docCount != pind1->doc_count)) {
        TWARN("doc_count[%u] in idx1 mismatch idx2_header[%u]!", pind1->doc_count, docCount);
        pind1->doc_count = docCount;
    }

    /*
    if (head->zipFlag == 1) {
        idx2_zip_header_t *zipHeader = (idx2_zip_header_t*)(head + 1);
        idx2_zip_skip_unit_t *skip = (idx2_zip_skip_unit_t*)(zipHeader + 1);

        if (skip[zipHeader->block_num - 1].off > (docCount - 1)) {
            TWARN("reduce block_num!");
            zipHeader->block_num--;
            skip[zipHeader->block_num].off         = docCount;
            skip[zipHeader->block_num].doc_id_base = IDX_GET_BASE(INVALID_DOCID);
        }
    }
    */

    // 扩容
    uint32_t len = 0;
    if(head->zipFlag == 1)
    {
        len = (_maxOccNum > 0) ? sizeof(idx2_zip_list_unit_t) : sizeof(uint16_t);
        if(begin + (len<<1) > end)
        {
            int32_t ret = expend(head, pind1, begin, end);
            if(ret != KS_SUCCESS)
                return ret;
        }
    }
    else
    {
        len = (_maxOccNum > 0) ? sizeof(idx2_nzip_unit_t) : sizeof(uint32_t);
        if(begin + (len<<1) > end)
        {
            int32_t ret = expend(head, pind1, begin, end);
            if(ret != KS_SUCCESS)
                return ret;
        }
    }
    // 增加一篇文档
    if(head->zipFlag == 1)
    {
        uint16_t base = IDX_GET_BASE(docId);
        uint16_t diff = IDX_GET_DIFF(docId);
        idx2_zip_header_t *zipHeader = (idx2_zip_header_t*)(head + 1);
        idx2_zip_skip_unit_t *skip = (idx2_zip_skip_unit_t*)(zipHeader + 1);

        if(_maxOccNum == 0)
        {
            *(uint16_t*)(begin+sizeof(uint16_t)) = IDX_GET_DIFF(INVALID_DOCID);;
            *(uint16_t*)begin = diff;
            begin += sizeof(uint16_t);
            zipHeader->doc_list_len += sizeof(uint16_t);
        }
        else
        {
            ((idx2_zip_list_unit_t*)(begin+sizeof(idx2_zip_list_unit_t)))->doc_id_diff = IDX_GET_DIFF(INVALID_DOCID);
            ((idx2_zip_list_unit_t*)begin)->doc_id_diff = diff;
            ((idx2_zip_list_unit_t*)begin)->occ = firstOcc;
            begin += sizeof(idx2_zip_list_unit_t);
            zipHeader->doc_list_len += sizeof(idx2_zip_list_unit_t);
        }

        if(zipHeader->block_num == 0 || base > skip[zipHeader->block_num-1].doc_id_base)
        {
            if(unlikely(zipHeader->block_num == _maxIncSkipCnt))
            {
                TWARN("inc reach max doc count limit!");
                return KS_SUCCESS;
            }
            skip[zipHeader->block_num+1].doc_id_base = IDX_GET_BASE(INVALID_DOCID);
            skip[zipHeader->block_num+1].off = pind1->doc_count + 1;
            skip[zipHeader->block_num].doc_id_base = base;
            skip[zipHeader->block_num].off = pind1->doc_count;
            zipHeader->block_num++;
        }
        else
        {
            skip[zipHeader->block_num].off = pind1->doc_count + 1;
        }

        pind1->doc_count++;
    }
    else
    {
        if(_maxOccNum == 0)
        {
            *(uint32_t*)(begin+sizeof(uint32_t)) = INVALID_DOCID;
            *(uint32_t*)begin = docId;
            pind1->doc_count++;
            begin += sizeof(uint32_t);
        }
        else
        {
            ((idx2_nzip_unit_t*)(begin+sizeof(idx2_nzip_unit_t)))->doc_id = INVALID_DOCID;
            ((idx2_nzip_unit_t*)begin)->doc_id = docId;
            ((idx2_nzip_unit_t*)begin)->occ    = firstOcc;
            pind1->doc_count++;
            begin += sizeof(idx2_nzip_unit_t);
        }
    }

    char* p1 = _pIncMemManager->offset2Addr(pind1->pos);
    head->endOff = begin - p1;

    if (_invertedDict->syncMgr)
    {
        IndexFieldSyncManager * pSyncMgr = (IndexFieldSyncManager *) _invertedDict->syncMgr;
        pSyncMgr->putIdxDictNode(pNode);
        pSyncMgr->syncToDisk();
    }

    return 1;
}