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

天之道

享受編程的樂趣。
posts - 118, comments - 7, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

最長重復子串

Posted on 2012-12-05 17:58 hoshelly 閱讀(1158) 評論(0)  編輯 收藏 引用 所屬分類: Programming
描述
對于一個字符串S1,其中S2是他的一個子串(長度嚴格小于S1長度),如果S2在S1中出現次數超過1次,那么S2就是一個重復子串,現在的要求是給定S1,請求出他的最長重復子串;

如果有多個長度一樣的最長子串,請輸入字典序最小那個串;

比如bbbaaaccc

那么最長子串就是aa

輸入
第一行包含一個整數T,表示有T組數據

對于每組數據包含一行,該行有一個字符串,長度小于10,000

輸出
對于每組數據請輸出他的最長重復子串,保證每組數據都有;

樣例輸入
2
abacabac
abacabbac

樣例輸出
abac
bac

代碼測試通過(普通版):

#include<stdio.h>
#include<string.h>
#define N 10000
int main()
{
    char a[N];
    int i,j,n,t,p,max,t1;
    scanf("%d",&t1);
    while(t1--)
    {
    max = 0;
    scanf("%s",a);
    n=strlen(a);
    for(i=0;i<n;i++)
    {
        for(j=i+1;j<n;j++)
        {
            t=0;
            while(a[i+t]==a[j+t]&&(j+t)<n)
                t++;
            if(t>max)
            {
                max=t;
                p=i;
            }
            else if(t == max) //如果有長度一樣的最長重復子串,那么比較它們的字典序
            {
                if(a[i]<a[p])
                {
                    max = t;
                    p = i;
                }
            }
        }
    }
    for(i=p;i<p+max;i++)
        printf("%c",a[i]);
    printf("\n");
    }
    return 0;
}
普通算法效率較低,為O(n²)。


第二種方法是用后綴數組實現。轉自:http://hi.baidu.com/qwertlooker/item/44f3fe52ad772cdbd58bacfd

如果程序至多可以處理MAXN個字符,這些字符被存儲在數組c中:
#define MAXN 5000000
char c[MAXN], *a[MAXN];
 在讀取輸入時,首先初始化a,這樣,每個元素就都指向輸入字符串中的相應字符:
while (ch = getchar()) != EOF
a[n] = &c[n];
c[n++] = ch;
c[n] = 0 //將數組c中的最后一個元素設為空字符,以終止所有字符串
這樣,元素a[0]指向整個字符串,下一個元素指向以第二個字符開始的數組的后綴,等等。如若輸入字符串為"banana",該數組將表示這些后綴:
a[0]:banana
a[1]:anana
a[2]:nana
a[3]:ana
a[4]:na
a[5]:a
由于數組a中的指針分別指向字符串中的每個后綴,所以將數組a命名為"后綴數組"
第二,對后綴數組進行快速排序,以將后綴相近的(變位詞)子串集中在一起
qsort(a, n, sizeof(char*), pstrcmp)后
a[0]:a
a[1]:ana
a[2]:anana
a[3]:banana
a[4]:na
a[5]:nana
第三,使用以下comlen函數對數組進行掃描比較鄰接元素,以找出最長重復的字符串:
for i = [0, n)
     if comlen(a[i], a[i+1]) > maxlen
         maxlen = comlen(a[i], a[i+1])
         maxi = i
printf("%.*s\n", maxlen, a[maxi])
由于少了內層循環,只是多了一次排序,因此該算法的運行時間為O(n logn). (nlogn比n大,取nlogn)

實現代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXCHAR 10000 //最長處理10000個字符

char c[MAXCHAR], *a[MAXCHAR];

int comlen( char *p, char *q ){  //計算最長重復子串的長度
    int i = 0;
    while( *p && (*p++ == *q++) )
        ++i;
    return i;
}

int pstrcmp( const void *p1, const void *p2 ){
    return strcmp( *(charconst *)p1, *(charconst*)p2 );
}

int main( ){
    int t;
    char ch;
    int i, temp;
    scanf("%d\n",&t);
    while(t--)
    {   
        int n=0;
        int maxlen=0, maxi=0;

      while( (ch=getchar())!='\n' ){
        a[n]=&c[n];
        c[n++]=ch;
    }
    c[n]='\0';
    qsort( a, n, sizeof(char*), pstrcmp ); //快速排序對后綴數組進行排序,以使后綴相同的子串集中在一起,
                                           
//以便接下來comlen函數對這些子串進行計算其最長重復子串
    for(i=0; i<n-1; ++i ){
        temp=comlen( a[i], a[i+1] );
        if( temp>maxlen )
        {
            maxlen=temp;
            maxi=i;
        }
    }
    printf("%.*s\n",maxlen, a[maxi]); //輸出最長重復子串
    }
    return 0;
}

第三種方法似乎可以用后綴樹實現,效率可以提高到O(n),具體的后綴樹講解可以參照這篇文章:
http://blog.csdn.net/v_july_v/article/details/6897097(PS:智商有限,后面部分講解理解不了)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美三级网址| 亚洲麻豆av| 亚洲男人av电影| 亚洲宅男天堂在线观看无病毒| 亚洲电影一级黄| 亚洲国产高清在线观看视频| 亚洲大胆av| 中文国产成人精品久久一| 欧美一级专区| 亚洲娇小video精品| 亚洲日本激情| 亚洲综合欧美| 欧美精品成人91久久久久久久| 欧美图区在线视频| 亚洲狠狠丁香婷婷综合久久久| 亚洲深爱激情| 毛片一区二区| 久久激情视频| 国产精品久久久久久久久久妞妞| 黑人极品videos精品欧美裸| 在线综合+亚洲+欧美中文字幕| 久久在线免费观看| 欧美一区二区成人6969| 国产精品www.| 亚洲综合首页| 亚洲欧美中文字幕| 国产伦精品一区二区三区高清版| 午夜精品婷婷| 欧美日韩一区二区三区免费| 日韩视频一区二区在线观看| 乱人伦精品视频在线观看| 亚洲欧美综合另类中字| 国产精品最新自拍| 欧美中文在线免费| 久久这里只有精品视频首页| 影音国产精品| 亚洲人精品午夜| 国产精品视屏| 欧美jizzhd精品欧美喷水| 久久人体大胆视频| 夜夜嗨网站十八久久| 中国亚洲黄色| 在线观看欧美日韩国产| 亚洲精品日本| 极品av少妇一区二区| 欧美激情亚洲一区| 国产精品久久久一区二区三区| 久久久999精品| 国产精品sm| 亚洲高清在线精品| 国产欧美日韩另类一区| 91久久精品国产91久久性色| 国产精品毛片va一区二区三区| 欧美aaa级| 国产一区二区三区高清播放| 日韩亚洲在线| 日韩视频免费在线| 免费欧美日韩| 欧美激情亚洲视频| 亚洲高清免费在线| 欧美在线在线| 老司机精品导航| 黄色成人在线观看| 欧美一区二区网站| 欧美色视频日本高清在线观看| 亚洲高清在线观看| 亚洲美女中文字幕| 欧美日韩在线播放| 亚洲一级二级| 久久久久久久精| 国产一区日韩一区| 美女啪啪无遮挡免费久久网站| 久久免费国产| 亚洲精品自在久久| 欧美天堂亚洲电影院在线观看| 一本久久综合| 久久亚洲欧美| 99re6热在线精品视频播放速度| 欧美大片在线观看| 一本色道综合亚洲| 毛片一区二区三区| 一区二区av在线| 国内精品久久久久久久果冻传媒 | 毛片基地黄久久久久久天堂| 国产午夜精品全部视频播放| 久久国产精品99国产精| 欧美成人国产va精品日本一级| 亚洲精品久久在线| 国内成+人亚洲| 国产精品久久亚洲7777| 欧美成人激情视频| 久久久久久久久久看片| 亚洲一二三四久久| 99国产精品视频免费观看一公开| 99国产一区二区三精品乱码| 亚洲国产一区二区在线| 香蕉久久久久久久av网站| 久久国产精品电影| 亚洲美女淫视频| 亚洲精品视频在线观看网站| 国产美女高潮久久白浆| 亚洲乱码国产乱码精品精| 好吊视频一区二区三区四区| 欧美日本三级| 久色成人在线| 女女同性精品视频| 久久亚洲欧洲| 麻豆精品在线视频| 久久夜色精品国产欧美乱极品| 亚洲欧洲av一区二区| 欧美淫片网站| 裸体歌舞表演一区二区| 能在线观看的日韩av| 欧美大片在线看免费观看| 久久综合中文色婷婷| 欧美国产大片| 国产精品免费看片| 国产欧美日韩精品在线| 激情亚洲网站| 99精品黄色片免费大全| 欧美一激情一区二区三区| 久久久久久一区二区三区| 欧美成人精品一区| 亚洲视频在线观看| 久久综合给合| 欧美视频中文一区二区三区在线观看| 欧美日韩国产首页在线观看| 国产伦精品一区二区三区免费迷| 国产一区观看| 日韩五码在线| 裸体素人女欧美日韩| 最新国产成人在线观看| 一二三区精品福利视频| 久久久国产成人精品| 欧美日韩视频免费播放| 亚洲国产精品一区二区第四页av| 亚洲欧美在线一区二区| 亚洲国产毛片完整版| 久久久久久久久久久成人| 欧美精品在线观看一区二区| 久久久一区二区三区| 国产欧美日韩精品a在线观看| 在线亚洲电影| 一区二区久久| 国产精品v日韩精品| 欧美亚洲视频| 欧美在线免费视频| 激情综合激情| 亚洲大胆女人| 欧美日韩国产亚洲一区| 制服丝袜亚洲播放| 亚洲一区影院| 狠久久av成人天堂| 91久久精品一区| 欧美日韩中文| 久久精品综合| 欧美国产日韩精品免费观看| 亚洲裸体俱乐部裸体舞表演av| 亚洲经典自拍| 欧美四级剧情无删版影片| 午夜精品久久久久久| 久久国产精品第一页| 91久久国产自产拍夜夜嗨| 99精品国产热久久91蜜凸| 国产麻豆精品theporn| 老司机一区二区| 欧美日韩一区二区三区在线看| 久久激情婷婷| 国产精品极品美女粉嫩高清在线 | 亚洲国产你懂的| 亚洲另类自拍| 亚洲国产一区二区三区青草影视| 99精品国产热久久91蜜凸| 在线播放亚洲| 欧美一级淫片播放口| 亚洲一二区在线| 欧美日本一区| 亚洲国产1区| 亚洲国产精品一区| 久久国产天堂福利天堂| 欧美一区二区三区在线播放| 欧美极品色图| 国产伦精品一区二区三区四区免费| 欧美成人免费全部观看天天性色| 久久不见久久见免费视频1| 韩国欧美国产1区| 亚洲免费影院| 欧美一区中文字幕| 国产精品视频精品视频| 中文欧美日韩| 欧美一级黄色录像| 国产精品亚洲不卡a| 亚洲伊人第一页| 久久久精品欧美丰满| 红杏aⅴ成人免费视频| 毛片av中文字幕一区二区| 亚洲国产日韩综合一区| 一区二区三区 在线观看视频| 欧美日韩日日骚| 亚洲欧美一区二区激情|