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

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 閱讀(564) 評論(0)  編輯 收藏 引用 所屬分類: 字符串

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

導航

統(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>
            欧美xxx在线观看| 六月天综合网| 亚洲一区在线视频| 国产欧美精品一区| 久久久久久久精| 久久亚洲综合网| 91久久精品久久国产性色也91| 久久综合亚州| 欧美福利网址| 午夜免费电影一区在线观看| 欧美亚洲视频| 亚洲国产欧美日韩| 亚洲深夜影院| 激情综合色综合久久综合| 欧美国产日韩a欧美在线观看| 欧美成人影音| 欧美一级视频一区二区| 久久精品一区二区三区不卡牛牛| 91久久精品日日躁夜夜躁欧美| 亚洲高清资源| 欧美日韩一区二区三区免费| 欧美亚洲在线| 欧美精品激情blacked18| 午夜精品美女自拍福到在线| 久久精品三级| 亚洲欧美国产日韩天堂区| 久久久久九九视频| 亚洲视频二区| 久久婷婷影院| 欧美亚洲尤物久久| 欧美日韩成人综合在线一区二区| 久久爱另类一区二区小说| 欧美jizzhd精品欧美喷水 | 免费成人小视频| 亚洲午夜激情| 免费亚洲电影| 久久久久久999| 国产精品激情偷乱一区二区∴| 久久夜色精品亚洲噜噜国产mv| 欧美日韩综合精品| 欧美大香线蕉线伊人久久国产精品| 国产精品久久久久久av下载红粉 | 亚洲直播在线一区| 久热精品在线视频| 久久久亚洲高清| 国产精品激情av在线播放| 亚洲高清影视| 91久久在线播放| 久久久精品久久久久| 亚洲欧美影院| 欧美视频在线一区| 亚洲精品日韩一| 亚洲精品视频免费观看| 久久精品国产免费观看| 久久精品99国产精品酒店日本| 欧美日韩一区在线| 亚洲毛片一区| 一本色道久久加勒比88综合| 免费视频久久| 欧美国产激情| 亚洲精品字幕| 欧美成在线观看| 亚洲黄页一区| 中文av字幕一区| 国产精品成人午夜| 一区二区三区高清在线| 亚洲午夜激情网页| 国产精品成人一区二区三区吃奶| 亚洲美女在线看| 亚洲永久在线观看| 国产精品区一区二区三| 亚洲伊人第一页| 久久九九全国免费精品观看| 国产一区视频在线看| 久久国内精品自在自线400部| 久久久久久九九九九| 狠狠久久婷婷| 老司机成人网| 亚洲激情社区| 亚洲天堂网在线观看| 国产精品国产三级欧美二区| 午夜精品久久| 另类专区欧美制服同性| 在线免费观看日本欧美| 欧美成人精品福利| 一本色道久久综合狠狠躁篇怎么玩| 亚洲一区二区视频在线观看| 国产老女人精品毛片久久| 欧美一区二区免费| 欧美高清视频一区| 亚洲一区二区动漫| 国产亚洲精品自拍| 欧美成人免费网站| 一区二区三区鲁丝不卡| 久久九九免费视频| 亚洲免费观看视频| 国产视频精品va久久久久久| 久久女同互慰一区二区三区| 亚洲精品久久久久久下一站| 午夜久久资源| 亚洲国产婷婷| 国产伦精品一区二区三区视频黑人 | 狂野欧美激情性xxxx| 亚洲精品久久久久久下一站 | 亚洲国产精品久久| 欧美午夜电影网| 小处雏高清一区二区三区| 亚洲第一页自拍| 午夜精品三级视频福利| 亚洲黄色在线看| 国产亚洲成av人片在线观看桃| 欧美福利一区二区| 久久精品国产免费观看| 亚洲另类视频| 欧美电影免费观看| 欧美影院成人| 亚洲视频免费| 亚洲精品之草原avav久久| 国产在线观看91精品一区| 欧美日韩国产美| 蜜桃精品久久久久久久免费影院| 亚洲一区二区在线观看视频| 亚洲国语精品自产拍在线观看| 久久免费视频这里只有精品| 亚洲欧美日韩一区在线观看| 日韩午夜在线观看视频| 亚洲成色www8888| 狠狠干综合网| 国产真实精品久久二三区| 国产精品av免费在线观看| 欧美大片91| 牛牛国产精品| 欧美电影电视剧在线观看| 久久精品国产999大香线蕉| 亚洲欧美日韩一区二区在线 | 久久精品国产综合| 亚洲一区精品在线| 亚洲网站视频福利| 亚洲先锋成人| 中日韩美女免费视频网站在线观看| 亚洲国产91| 亚洲欧洲精品一区二区三区| 亚洲高清激情| 亚洲国产精品精华液2区45| 欧美黄色一区| 亚洲激情网站| 日韩视频久久| 亚洲社区在线观看| 亚洲资源av| 欧美一区亚洲| 久久久久一区二区三区| 久久亚洲国产精品日日av夜夜| 久久久xxx| 女仆av观看一区| 欧美日韩成人网| 国产精品萝li| 国产一区成人| 尤物yw午夜国产精品视频明星| 黄色亚洲免费| 亚洲精品日韩欧美| 正在播放亚洲| 久久久999国产| 欧美国产日韩xxxxx| 亚洲欧洲日韩女同| 亚洲私人影院| 久久九九全国免费精品观看| 美女视频一区免费观看| 欧美片在线观看| 国产欧美日韩在线| 亚洲日本欧美日韩高观看| 一二三区精品| 久久久综合精品| 亚洲日本黄色| 欧美一站二站| 欧美韩国日本综合| 国产乱码精品1区2区3区| 国内久久婷婷综合| 在线亚洲免费视频| 久久久www成人免费精品| 亚洲黄色视屏| 欧美亚洲专区| 欧美激情视频一区二区三区在线播放 | 欧美日韩伦理在线| 国内精品免费午夜毛片| 在线亚洲欧美视频| 久久综合免费视频影院| 99国产精品国产精品毛片| 久久精品日韩| 国产精品网曝门| 99re6这里只有精品视频在线观看| 性欧美长视频| 亚洲美女视频| 鲁鲁狠狠狠7777一区二区| 国产精品一区二区三区成人| 亚洲精品日韩久久| 老司机67194精品线观看| 亚洲一区二区在线视频| 欧美国产日本在线| 伊人激情综合| 久久xxxx精品视频|