青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

poj 1226 Substrings 后綴數組

   求N個字符串最長的公共子串。這題數據比較水,暴力第一個字符串的子串也可以過。
初學后綴數組,有很多不明白的東西,此題后綴數組的代碼在網上也是一把抓。
   說實話我確實還不懂后綴數組,但是后綴數組太強大了,只能硬著頭皮照著葫蘆畫瓢了。
貼下代碼方便以后查閱吧。。。
   感覺后綴數組的應用最主要的還是height數組,看懂倍增算法排序后綴已經非常困難了。
然后再理解height數組怎么用也不是一件容易的事情。然后貌似height數組最關鍵的用法是
枚舉某一個長度的子串時候,比如長度為k,能夠用這個k對height數組進行分組,這個羅穗騫
的論文里面有個求不重疊最長重復子串的例子說明了這個height數組分組的思路,不過我現在
還是不怎么理解。。。
  
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

const int MAX_N = 110;
const int MAX_L = MAX_N * MAX_N;
char szStr[MAX_N];
int nNum[MAX_L];
int nLoc[MAX_L];
bool bVisit[MAX_N];
int sa[MAX_L], rank[MAX_L], height[MAX_L];
int wa[MAX_L], wb[MAX_L], wv[MAX_L], wd[MAX_L];

int cmp(int* r, int a, int b, int l)
{
    return r[a] == r[b] && r[a + l] == r[b + l];
}

//倍增算法,r為待匹配數組,n為總長度,m為字符串范圍
void da(int* r, int n, int m)
{
    int i, j, p, *x = wa, *y = wb;
    
    for (i = 0; i < m; ++i) wd[i] = 0;
    for (i = 0; i < n; ++i) wd[x[i] = r[i]]++;
    for (i = 1; i < m; ++i) wd[i] += wd[i - 1];
    for (i = n - 1; i >= 0; --i) sa[--wd[x[i]]] = i;
    
    for (j = 1, p = 1; p < n; j *= 2, m = p)
    {
        for (p = 0, i = n - j; i < n; ++i) y[p++] = i;
        for (i = 0; i < n; ++i) if (sa[i] >= j) y[p++] = sa[i] - j;
        
        for (i = 0; i < n; ++i) wv[i] = x[y[i]];
        for (i = 0; i < m; ++i) wd[i] = 0;
        for (i = 0; i < n; ++i) wd[wv[i]]++;
        for (i = 1; i < m; ++i) wd[i] += wd[i - 1];
        for (i = n - 1; i >= 0; --i) sa[--wd[wv[i]]] = y[i];
        
        swap(x, y);
        for (p = 1, x[sa[0]] = 0, i = 1; i < n; ++i)
        {
            x[sa[i]] = cmp(y, sa[i - 1], sa[i], j)? p - 1 : p++;
        }
    }
}

//求height數組
void calHeight(int* r, int n)
{
    int i, j, k = 0;
    for (i = 1; i <= n; ++i) rank[sa[i]] = i;
    for (i = 0; i < n; height[rank[i++]] = k)
    {
        if (k) --k;
        for(j = sa[rank[i] - 1]; r[i + k] == r[j + k]; k++);
    }
}

bool Check(int nMid, int nLen, int nN)
{
    int nCnt = 0;
    
    memset(bVisit, falsesizeof(bVisit));
    for (int i = 2; i <= nLen; ++i)
    {
        if (nMid > height[i])
        {
            nCnt = 0;
            memset(bVisit, falsesizeof(bVisit));
            continue;
        }
        if (!bVisit[nLoc[sa[i - 1]]])
        {
            bVisit[nLoc[sa[i - 1]]] = true;
            ++nCnt;
        }
        if (!bVisit[nLoc[sa[i]]])
        {
            bVisit[nLoc[sa[i]]] = true;
            ++nCnt;
        }
        if (nCnt == nN) return true;
    }
    
    return false;
}

int main()
{
    int nT;
    
    scanf("%d", &nT);
    while (nT--)
    {
        int nN;
        int nEnd = 300;
        int nP = 0;
        scanf("%d", &nN);
        for (int i = 1; i <= nN; ++i)
        {
            scanf("%s", szStr);
            char* pszStr;
            for (pszStr = szStr; *pszStr; ++pszStr)
            {
                nLoc[nP] = i;
                nNum[nP++] = *pszStr;
            }
            nLoc[nP] = nEnd;
            nNum[nP++] = nEnd++;
            
            reverse(szStr, szStr + strlen(szStr));
            for (pszStr = szStr; *pszStr; ++pszStr)
            {
                nLoc[nP] = i;
                nNum[nP++] = *pszStr;
            }
            nLoc[nP] = nEnd;
            nNum[nP++] = nEnd++;
        }
        nNum[nP] = 0;
        
        da(nNum, nP + 1, nEnd);
        calHeight(nNum, nP);
        
        int nLeft = 1, nRight = strlen(szStr), nMid;
        int nAns = 0;
        while (nLeft <= nRight)
        {
            nMid = (nLeft + nRight) / 2;
            if (Check(nMid, nP, nN))
            {
                nLeft = nMid + 1;
                nAns = nMid;
            }
            else nRight = nMid - 1;
        }
        printf("%d\n", nAns);
    }
    
    return 0;
}

posted on 2012-10-23 21:11 yx 閱讀(562) 評論(0)  編輯 收藏 引用 所屬分類: 字符串

<2012年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

導航

統計

公告

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

me

好友

同學

網友

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美成人综合一区| 老牛国产精品一区的观看方式| 亚洲一区二区三区中文字幕在线| 在线播放中文字幕一区| 国产性做久久久久久| 国产麻豆成人精品| 国产三区二区一区久久| 亚洲大胆女人| 欧美大片免费观看| 亚洲美女视频| 亚洲欧美一区二区三区极速播放| 午夜一区二区三区不卡视频| 久久蜜桃香蕉精品一区二区三区| 欧美国产综合一区二区| 国产精品成人国产乱一区| 国模精品一区二区三区色天香| 亚洲激情在线| 欧美一区二区在线播放| 亚洲成人在线视频网站| 亚洲欧美国产精品va在线观看| 久久在线精品| 国产美女扒开尿口久久久| 在线观看91精品国产麻豆| 亚洲新中文字幕| 欧美不卡视频一区发布| aaa亚洲精品一二三区| 欧美在线播放| 欧美日韩不卡在线| 精品动漫3d一区二区三区免费 | 久久午夜精品| 国产精品久久久久7777婷婷| 亚洲大片在线观看| 亚洲欧美乱综合| 亚洲国产专区校园欧美| 久久精品成人一区二区三区蜜臀| 欧美日韩国产一中文字不卡| 黑人一区二区| 亚洲欧美日韩在线不卡| 亚洲国产精品va在线看黑人动漫 | 免费日韩成人| 欧美在线观看日本一区| 亚洲国产综合91精品麻豆| 亚洲影院免费观看| 欧美三级第一页| 亚洲激情国产精品| 久久免费视频在线| 性色一区二区三区| 国产精品欧美日韩一区| 亚洲精品一区二区三区av| 免费在线欧美黄色| 久久国产夜色精品鲁鲁99| 国产精品美女www爽爽爽| 一区二区三区视频观看| 亚洲欧洲另类| 麻豆成人小视频| 影音先锋亚洲电影| 久久久久久久精| 欧美在线在线| 国产亚洲一区二区三区在线观看| 欧美中日韩免费视频| av成人手机在线| 国产精品a久久久久| 亚洲一级在线| 一区二区三区高清在线观看| 欧美日韩综合在线| 亚洲欧美日韩天堂一区二区| 一本色道久久综合精品竹菊| 欧美日韩在线一区| 亚洲欧美一区二区激情| 亚洲欧美中文日韩在线| 韩国av一区二区三区四区| 鲁鲁狠狠狠7777一区二区| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲区一区二区三区| 亚洲精品老司机| 欧美视频中文在线看| 午夜视频精品| 久久免费高清| 一区二区三区**美女毛片| 亚洲天堂av图片| 国内偷自视频区视频综合| 欧美激情小视频| 国产精品videossex久久发布| 久久国产精彩视频| 久久尤物视频| 亚洲图片在区色| 亚洲欧美国产77777| 在线不卡免费欧美| 亚洲日本成人| 国产有码一区二区| 亚洲免费高清视频| 亚洲高清激情| 国产欧美亚洲视频| 91久久嫩草影院一区二区| 国产精品日韩在线播放| 欧美r片在线| 国产九九精品| 亚洲人www| 极品少妇一区二区三区| 夜夜嗨av一区二区三区中文字幕| 国产尤物精品| 欧美 日韩 国产 一区| 欧美精品导航| 欧美制服丝袜| 欧美绝品在线观看成人午夜影视| 亚洲一区免费在线观看| 久久青草福利网站| 中文欧美在线视频| 久久免费国产精品| 午夜精品剧场| 欧美精品乱码久久久久久按摩| 亚洲欧美日韩精品久久久| 老司机一区二区三区| 欧美一级艳片视频免费观看| 欧美sm重口味系列视频在线观看| 亚洲欧美一区二区三区极速播放 | 一区二区三区 在线观看视| 国产真实乱偷精品视频免| 日韩亚洲国产欧美| 在线精品视频免费观看| 亚洲一区日韩在线| 99re8这里有精品热视频免费| 久久国产欧美| 亚洲欧美日韩系列| 欧美日韩免费观看中文| 欧美成人在线影院| 在线看片一区| 久久久之久亚州精品露出| 欧美一区不卡| 国产乱码精品一区二区三区不卡| 夜夜嗨av一区二区三区四季av| 亚洲精选视频在线| 另类欧美日韩国产在线| 久久全国免费视频| 亚洲国产另类精品专区| 在线观看三级视频欧美| 久久久久一区二区三区四区| 久久资源av| 亚洲第一在线综合网站| 久久国产免费| 欧美国产一区视频在线观看| 亚洲国产精品小视频| 欧美精品aa| 一区二区三区成人精品| 亚洲综合99| 国产精品久久久久久久一区探花| 洋洋av久久久久久久一区| 在线视频欧美精品| 欧美涩涩视频| 欧美一区二区在线免费播放| 毛片av中文字幕一区二区| 亚洲电影第1页| 免费久久99精品国产| 亚洲人成网站777色婷婷| 亚洲视频免费看| 国产精品入口日韩视频大尺度| 午夜精品一区二区三区在线| 免费成人性网站| 99国产精品久久久久老师 | 免费亚洲一区| 一区二区三区国产精华| 久久国产欧美精品| 亚洲成人自拍视频| 亚洲精品美女久久久久| 国产一区二区成人久久免费影院| 欧美一区亚洲| 亚洲国产美女精品久久久久∴| 日韩一区二区免费看| 国产精品久久7| 久久久精品网| 日韩视频专区| 久久久国产精彩视频美女艺术照福利| 伊人久久噜噜噜躁狠狠躁| 欧美激情中文字幕在线| 性色av一区二区三区| 欧美激情网站在线观看| 亚洲自拍偷拍一区| 亚洲国产精品成人va在线观看| 欧美日韩人人澡狠狠躁视频| 久久久久久穴| 亚洲一区精品视频| 欧美高清你懂得| 欧美在线观看视频一区二区| 亚洲另类黄色| 国产亚洲精品久久久| 欧美日本精品一区二区三区| 亚洲欧美国产高清| 99re66热这里只有精品4| 欧美成人一区二区在线 | 亚洲国产天堂久久综合网| 国产精品爽黄69| 欧美喷潮久久久xxxxx| 美腿丝袜亚洲色图| 久久精品91| 午夜国产不卡在线观看视频| 99re6热只有精品免费观看| 欧美顶级艳妇交换群宴| 久久精品亚洲| 久久成人免费电影| 亚洲一区精品视频|