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

poj 1226 Substrings 后綴數(shù)組

   求N個字符串最長的公共子串。這題數(shù)據(jù)比較水,暴力第一個字符串的子串也可以過。
初學后綴數(shù)組,有很多不明白的東西,此題后綴數(shù)組的代碼在網(wǎng)上也是一把抓。
   說實話我確實還不懂后綴數(shù)組,但是后綴數(shù)組太強大了,只能硬著頭皮照著葫蘆畫瓢了。
貼下代碼方便以后查閱吧。。。
   感覺后綴數(shù)組的應用最主要的還是height數(shù)組,看懂倍增算法排序后綴已經(jīng)非常困難了。
然后再理解height數(shù)組怎么用也不是一件容易的事情。然后貌似height數(shù)組最關鍵的用法是
枚舉某一個長度的子串時候,比如長度為k,能夠用這個k對height數(shù)組進行分組,這個羅穗騫
的論文里面有個求不重疊最長重復子串的例子說明了這個height數(shù)組分組的思路,不過我現(xiàn)在
還是不怎么理解。。。
  
#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為待匹配數(shù)組,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數(shù)組
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年1月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

導航

統(tǒng)計

公告

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

me

好友

同學

網(wǎng)友

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲婷婷国产精品电影人久久| 欧美日韩国产成人在线免费| 麻豆视频一区二区| 亚洲一区二区高清| 亚洲伊人网站| 欧美在线网址| 欧美一区二区| 美腿丝袜亚洲色图| 亚洲国产精品一区制服丝袜| 欧美影院午夜播放| 另类春色校园亚洲| 亚洲国产精品久久久久秋霞蜜臀| 亚洲日韩视频| 午夜亚洲伦理| 欧美成人中文字幕在线| 欧美性猛交99久久久久99按摩| 国产精品一区免费在线观看| 永久免费毛片在线播放不卡| 亚洲剧情一区二区| 欧美一区二区三区在线| 欧美国产激情二区三区| 一本色道久久精品| 久久久久久噜噜噜久久久精品| 欧美另类综合| 韩国在线视频一区| 亚洲午夜精品17c| 久久综合色8888| 亚洲天堂网站在线观看视频| 免费观看一级特黄欧美大片| 国产精品专区第二| 日韩一级在线观看| 久热国产精品| 亚洲欧美一区二区原创| 欧美日本亚洲视频| 亚洲大胆av| 久久久久久久久久久一区| 99一区二区| 欧美xart系列在线观看| 韩日成人在线| 欧美高清在线一区二区| 国产精品视频| 日韩视频在线免费观看| 久久综合九色九九| 亚洲欧美国产日韩中文字幕| 欧美理论电影在线播放| 激情五月婷婷综合| 欧美一区=区| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 伊人久久大香线蕉av超碰演员| 一区二区欧美亚洲| 欧美激情在线狂野欧美精品| 久久精品国产96久久久香蕉 | 永久免费毛片在线播放不卡| 欧美一区日本一区韩国一区| 99精品视频免费在线观看| 老牛影视一区二区三区| 国产欧美精品日韩区二区麻豆天美| 宅男噜噜噜66一区二区66| 亚洲高清视频中文字幕| 久久蜜桃精品| 狠狠噜噜久久| 久久久伊人欧美| 亚洲综合第一| 国产精品一区二区久久久| 午夜视频久久久| 亚洲视频电影在线| 国产精品久久久久9999高清| 亚洲欧美日韩综合国产aⅴ| 国产精品99久久久久久www| 欧美日韩一区二区三区四区在线观看| 亚洲美女视频在线免费观看| 亚洲精品国产精品久久清纯直播| 欧美精品粉嫩高潮一区二区 | 精品1区2区3区4区| 欧美波霸影院| 欧美精品一区二区三区在线播放| 亚洲麻豆一区| 在线视频日韩精品| 国产精品一二三四区| 久久精品欧洲| 久久中文字幕一区| 一本综合精品| 午夜国产一区| 亚洲激精日韩激精欧美精品| 亚洲日本成人网| 国产精品高潮久久| 久久免费黄色| 欧美大片一区二区| 夜夜嗨av一区二区三区网页| 亚洲一区久久久| 午夜精品亚洲| 亚洲国产精品va在线看黑人| 日韩视频二区| 国产美女精品在线| 欧美电影免费观看大全| 欧美视频日韩| 欧美成人国产va精品日本一级| 欧美精品一线| 久久精品中文字幕一区二区三区| 久久中文字幕导航| 性欧美1819性猛交| 欧美成人中文| 久久精品国产亚洲一区二区三区| 欧美高清在线| 老司机久久99久久精品播放免费 | 欧美成人精品高清在线播放| 99re6这里只有精品| 欧美一区二区三区婷婷月色 | 亚洲免费观看高清在线观看| 一区二区三区四区五区在线| 亚洲成色www久久网站| 亚洲一区二区三区视频播放| 亚洲日本中文字幕| 久久国产免费| 亚洲欧美日韩国产一区二区三区 | 免费在线看成人av| 欧美日韩国产在线播放| 久久一区二区三区四区五区| 欧美视频免费在线观看| 欧美激情一区二区三区高清视频| 国产日韩在线播放| 亚洲一区免费观看| av成人动漫| 久久这里只有精品视频首页| 久久青青草综合| 国产视频久久网| 亚洲一区成人| 亚洲欧美bt| 国产精品二区二区三区| 日韩香蕉视频| 在线视频你懂得一区二区三区| 麻豆精品在线播放| 欧美成人黑人xx视频免费观看| 韩国一区二区在线观看| 久久国产日韩| 久久综合九色99| 一区二区亚洲精品国产| 久久成人免费日本黄色| 久久久免费av| 国产欧美日韩专区发布| 亚洲欧美日韩国产一区二区| 午夜激情综合网| 国产精品久久影院| 亚洲图片欧洲图片av| 亚久久调教视频| 国产一区二区成人| 久久精品国产成人| 久久久一本精品99久久精品66| 国内精品美女在线观看| 欧美在线一级视频| 国模私拍一区二区三区| 久久蜜桃精品| 亚洲国产欧美一区| 一区二区欧美激情| 国产精品视频网站| 久久精品一区中文字幕| 欧美激情第一页xxx| 在线视频一区二区| 国产欧美精品一区| 久久野战av| av不卡在线| 久久久精品性| 亚洲激情第一页| 欧美小视频在线观看| 欧美在线免费播放| 亚洲欧洲一区二区在线观看| 亚洲欧美日韩另类| 1769国内精品视频在线播放| 欧美激情一区二区三区在线| 亚洲天堂偷拍| 欧美激情视频在线播放| 亚洲综合日本| 亚洲国产精品va在线看黑人| 国产精品成人va在线观看| 欧美一区二区三区免费看| 亚洲第一中文字幕| 午夜天堂精品久久久久| 亚洲区欧美区| 国产亚洲精品bt天堂精选| 欧美黄色免费| 久久国内精品视频| 亚洲精品国产精品国自产观看| 午夜精品短视频| 亚洲人成人一区二区在线观看| 国产精品香蕉在线观看| 久久综合一区二区| 亚洲欧美视频在线观看| 亚洲国产精品v| 欧美一区免费| 亚洲欧美激情一区| 亚洲精品黄色| 激情久久久久久| 国产精品性做久久久久久| 欧美h视频在线| 久久久999| 欧美亚洲综合久久| 亚洲无玛一区| 一区二区三区国产| 亚洲精品女人| 理论片一区二区在线|