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

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>
            久久综合狠狠| 欧美日韩国产色综合一二三四| 国产精品国产三级国产专播精品人 | 欧美日韩一区精品| 欧美精品一区二区三| 欧美国产亚洲另类动漫| 欧美日韩在线三区| 国产精品美女xx| 国产在线精品自拍| 亚洲国产一区二区三区在线播| 亚洲毛片一区二区| 亚洲小说春色综合另类电影| 午夜亚洲精品| 久久亚洲欧美| 亚洲日本欧美| 亚洲视频久久| 久久久久国产精品人| 麻豆av一区二区三区| 欧美黄污视频| 国产欧美精品一区| 亚洲精品国产精品乱码不99| 亚洲欧美日韩一区二区三区在线观看| 欧美一区在线视频| 欧美华人在线视频| 亚洲一区二区三区777| 久久精品综合| 国产精品高清免费在线观看| 精品盗摄一区二区三区| 亚洲一区制服诱惑| 欧美国产日韩一区二区三区| 国产精品99久久久久久久久| 久久av二区| 另类综合日韩欧美亚洲| 亚洲精品免费电影| 久久精品亚洲一区二区| 欧美午夜电影网| 一区二区在线视频| 亚洲一区二区伦理| 欧美激情国产日韩| 午夜一区在线| 国产精品xxx在线观看www| 亚洲国产99| 久久精品日韩欧美| 一区二区精品| 欧美成人国产| 亚洲第一区色| 久久中文字幕一区| 午夜精品视频| 国产精品入口夜色视频大尺度| 一本在线高清不卡dvd| 欧美成人午夜激情在线| 欧美在线播放一区| 国产日韩欧美亚洲一区| 午夜精品久久久| 一区二区三区欧美在线| 欧美日韩精品在线观看| 亚洲人成高清| 欧美国产日韩一区二区| 久久久久久网站| 一区免费在线| 久久免费午夜影院| 久久久99精品免费观看不卡| 国产伦精品一区二区三区免费| 亚洲男女自偷自拍| 中文一区二区| 国产日韩精品在线播放| 欧美伊久线香蕉线新在线| 国产精品99久久久久久宅男| 国产精品久久久久毛片软件| 欧美一区二区三区视频| 午夜精品久久久久久久99热浪潮| 国产精品福利影院| 欧美影院精品一区| 欧美中文字幕久久| 精久久久久久久久久久| 亚洲成人在线网| 欧美日韩国产123区| 亚洲欧美在线一区二区| 久久国产精品黑丝| 亚洲国产欧美久久| 99天天综合性| 国产麻豆9l精品三级站| 狼狼综合久久久久综合网| 久久久久久久999精品视频| 亚洲精品久久久久久久久久久久 | 亚洲一区区二区| 国产日韩欧美日韩| 免费成人激情视频| 国产午夜精品视频| 国产综合亚洲精品一区二| 免费在线成人| 欧美日韩极品在线观看一区| 亚洲欧美日本伦理| 久久久99久久精品女同性| 亚洲国产美女| 夜夜爽99久久国产综合精品女不卡| 国产精品裸体一区二区三区| 免费不卡中文字幕视频| 欧美日韩三区四区| 久久久久国产精品麻豆ai换脸| 欧美va日韩va| 久久精品国产在热久久| 欧美精品国产精品| 性欧美长视频| 欧美精品97| 美女脱光内衣内裤视频久久影院| 欧美成人午夜激情视频| 久久精品国产欧美亚洲人人爽| 欧美激情综合在线| 久久偷窥视频| 国产精品成人免费| 免费成人毛片| 国产伦精品一区二区三区免费迷| 欧美高清不卡在线| 国产亚洲欧美日韩精品| 99亚洲视频| 亚洲精品少妇30p| 久久国产精品99国产| 亚洲欧美日韩国产| 欧美成人免费视频| 久久久久久久久岛国免费| 国产精品国产自产拍高清av| 欧美成人日本| 国产综合在线视频| 亚洲欧美资源在线| 午夜精品区一区二区三| 欧美三级资源在线| 亚洲精品久久久久久下一站| 亚洲电影免费观看高清完整版在线 | 亚洲国产高清在线观看视频| 午夜精品久久久久99热蜜桃导演| 在线亚洲欧美视频| 欧美激情va永久在线播放| 欧美成人性网| 伊人蜜桃色噜噜激情综合| 欧美一区免费视频| 久久久国产一区二区| 国产午夜亚洲精品羞羞网站| 亚洲欧美精品中文字幕在线| 亚洲欧美日韩精品一区二区 | 午夜久久久久久久久久一区二区| 亚洲视频在线观看一区| 欧美日产一区二区三区在线观看 | 在线观看一区欧美| 亚洲欧美一区二区原创| 欧美呦呦网站| 久久久久久穴| 在线成人免费视频| 久久资源在线| 欧美激情第一页xxx| 亚洲精品欧美精品| 欧美—级高清免费播放| 亚洲人成在线观看网站高清| 亚洲作爱视频| 国产精品久久国产精麻豆99网站| 一本综合久久| 欧美一区二区三区在线视频| 国产日韩在线一区| 毛片精品免费在线观看| 亚洲精品1234| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美日韩国产精品一区| 亚洲欧美国产三级| 久久久久久欧美| 亚洲人成网站在线播| 欧美日韩一区免费| 欧美在线综合| 亚洲区在线播放| 性欧美激情精品| 亚洲第一中文字幕在线观看| 欧美日韩亚洲激情| 久久精品国产99精品国产亚洲性色 | 一区二区三区在线观看欧美| 欧美精品久久99| 午夜精品在线| 亚洲欧洲日夜超级视频| 亚洲欧美欧美一区二区三区| 合欧美一区二区三区| 欧美日韩不卡视频| 久久精品国产精品 | 久久综合久久久久88| 亚洲精品乱码久久久久久按摩观| 国产精品高潮呻吟久久| 久久久夜夜夜| 亚洲少妇自拍| 欧美11—12娇小xxxx| 午夜视频一区| 亚洲视频图片小说| 亚洲承认在线| 国产一级久久| 国产精品久久久久久久电影 | 亚洲午夜激情免费视频| 欧美www视频| 欧美亚洲综合久久| 在线午夜精品| 亚洲精品久久在线| 亚洲国产精品va在看黑人| 国产日韩精品一区二区三区在线| 欧美日韩精品中文字幕| 久久一综合视频|