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

Tim's Programming Space  
Tim's Programming Space
日歷
<2009年11月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345
統計
  • 隨筆 - 20
  • 文章 - 1
  • 評論 - 40
  • 引用 - 0

導航

常用鏈接

留言簿(3)

隨筆檔案

文章檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

 
前兩天在yjw神牛和hyf神牛的共同努力下終于學會了后綴數組O(nlogn)倍增構造方法。

構造:
定義s[k][i]表示從s字符串的第i位開始的長度為k的一個字符串(后綴),不夠的補零,sa[k][i]表示在所有長度為k的后綴中排序后大小為第i的后綴的位置。顯然sa[1]可以直接qsort得到。當sa[k]求到過后,sa[2k]的每個元素都可以O(1)比較得出,這時用桶排,把sa[k]中排名相同的放在一起(放在一個桶里),那么對于每個不同的桶中的元素,他們之間的大小關系就已經確定了,對于同一個桶中的元素,s[2k][i]的前k位是一樣的,可能不一樣只有后k位,而這個我們是已經得到了的,所以通過sa[k][i]可以算出sa[2k][i-k],桶排把排序過程復雜度降成了O(n),總體構造的復雜度就成了O(nlogn)。DC3算法貌似可以把復雜度降到O(n)...暫時只有膜拜的份了。

現在定義sa[i]為所有后綴排好序后的第i個后綴在原序列中的位置。
定義rank[i]為后綴s[i]在后綴排好序的序列中的排名。
當sa數組求出來了過后,就可以構造h和height數組了。
定義height數組為排好序的后綴中相鄰兩項的LCP(最常公共前綴),即height[i] = LCP(sa[i],sa[i-1])。
定義h數組為原序列中的某個后綴與排好序的后綴中它的前一個的LCP,即h[i] = LCP(i,sa[rank[i]-1])。

然后有一個hyf和yjw神牛都不知道怎么來的很牛X的定理:h[i]>=h[i-1]-1。。。所以就可以在O(n)時間內直接for出這個h數組來。。。(這步是最詭異也最精髓的,因為沒有這個數組后綴數組就沒什么用了。。求神牛們講解下這個定理的證明。。)
求出了h數組后height數組也可以直接得到。

實現方式是用了兩個指針輪番上陣,看起來可能會有點糾結。。

應用:
有了h和height數組后,我們就可以用它來做很多事情。但我還不是很熟,只會求一個字符串里面可以相交的最長重復字串的長度。。
cii(uva?)3901 Editor就是這樣一道題。
比如abcabcabc的最長重復字串就是abcabc。
其實求出了h和height數組后就變得很簡單,就是h或height數組中最大的一個。

歡迎大牛神牛們前來補充和指正!

 1 /*
 2  * $Date: Fri Nov 27 09:00:37 2009 CST
 3  * $File: 3901.cpp
 4  */
 5 #include <iostream>
 6 #include <cstdio>
 7 #include <cstdlib>
 8 #include <cstring>
 9 #include <algorithm>
10 #define MAXLEN 50000
11 
12 using namespace std;
13 
14 char s[MAXLEN+1];
15 bool cmp(const int &a,const int &b){
16     return s[a]<s[b];
17 }
18 
19 int sa[MAXLEN+1],rank[MAXLEN+1],tmp1[MAXLEN+1],tmp2[MAXLEN+1];
20 int h[MAXLEN+1],height[MAXLEN+1];
21 
22 void Solve(){
23     scanf("%s",s);
24     int n = strlen(s);
25     s[n++= 0;
26     for (int i = 0; i<n; i++)
27         sa[i] = i;
28     sort(sa,sa+n,cmp);
29     
30     rank[sa[0]] = 0;
31     for (int i = 1; i<n; i++)
32         if (s[sa[i]]==s[sa[i-1]])
33             rank[sa[i]] = rank[sa[i-1]];
34         else
35             rank[sa[i]] = rank[sa[i-1]]+1;
36 
37     int *s1 = sa,*s2 = tmp1,*= tmp2, *= rank;
38     for (int i = 1; i<n&&r[sa[n-1]]<n-1; i<<=1){
39         //b is the barrel
40         for (int j = 0; j<n; j++)
41             b[r[s1[j]]] = j;
42         for (int j = n-1; j>=0; j--)
43             if (s1[j]>=i)
44                 s2[b[r[s1[j]-i]]--= s1[j]-i;
45         for (int j = n-i; j<n; j++)
46             s2[b[r[j]]] = j;
47         swap(s1,s2);
48         b[s1[0]] = 0;//cause the barrel is now useless, use b as the new rank array
49         for (int j = 1; j<n; j++)
50             if (r[s1[j]]!=r[s1[j-1]]||r[s1[j]+i]!=r[s1[j-1]+i])
51                 b[s1[j]] = b[s1[j-1]]+1;
52             else
53                 b[s1[j]] = b[s1[j-1]];
54         swap(b,r);
55     }
56     //calc 
57     for (int i = 0; i<n; i++){
58         if (r[i] == 0)
59             h[i] = 0;
60         else if (i == 0||h[i-1== 0)
61             for (h[i] = 0; s[i+h[i]]==s[s1[r[i]-1]+h[i]];h[i]++);
62         else 
63             for (h[i]=h[i-1]-1 ; s[i+h[i]]==s[s1[r[i]-1]+h[i]];h[i]++);
64     }
65     int Ans = 1;
66     for (int i = 0; i<n; i++)
67         Ans = max(Ans,h[i]);
68     printf("%d\n",Ans);
69 }
70 int main(){
71     int t;
72     scanf("%d",&t);
73     while (t--)
74         Solve();
75     return 0;
76 }
77 

posted on 2009-11-27 09:06 TimTopCoder 閱讀(1560) 評論(0)  編輯 收藏 引用
 
Copyright © TimTopCoder Powered by: 博客園 模板提供:滬江博客
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            麻豆精品国产91久久久久久| 国语自产在线不卡| 亚洲欧美久久久久一区二区三区| 欧美激情一区二区| 男人天堂欧美日韩| 免费看成人av| 欧美激情中文字幕在线| 亚洲大片av| 亚洲国产午夜| 一区二区国产在线观看| 亚洲免费影视| 老司机免费视频一区二区| 欧美国产日韩一区二区| 国产精品久久久一区麻豆最新章节 | 欧美日本免费一区二区三区| 久久国产欧美| 老司机免费视频一区二区三区| 欧美一区二区三区在线观看视频 | 久久久久久久网| 欧美大香线蕉线伊人久久国产精品| 欧美高清免费| 国产精品久久久久久久久久久久久久| 国产一区二区三区日韩欧美| 亚洲黄色av一区| 亚洲特色特黄| 久久精品国亚洲| 亚洲日本va在线观看| 亚洲视频在线看| 久久久久国产精品一区| 欧美午夜视频一区二区| 在线播放一区| 香蕉成人久久| 亚洲日本久久| 久久久一二三| 国产情人节一区| 日韩亚洲欧美在线观看| 狂野欧美性猛交xxxx巴西| 亚洲视频999| 欧美日韩久久久久久| 亚洲大片在线观看| 久久成人这里只有精品| 一区二区三区**美女毛片| 欧美a级在线| 激情久久一区| 久久精品卡一| 一区二区三区国产盗摄| 欧美精品v日韩精品v国产精品 | 亚洲精品视频中文字幕| 久久午夜激情| 香港久久久电影| 国产精品久久久久天堂| 日韩亚洲精品电影| 亚洲电影网站| 麻豆精品国产91久久久久久| 永久免费精品影视网站| 久久国产精品99国产精| 亚洲男同1069视频| 国产精品日本欧美一区二区三区| 亚洲视频一二区| 亚洲人线精品午夜| 欧美精品一区二区三区蜜臀| 亚洲激情网址| 香蕉久久国产| 国产精品99久久久久久久久久久久 | 欧美在线视频在线播放完整版免费观看| 久久久久www| 性感少妇一区| 国产美女搞久久| 性欧美video另类hd性玩具| 99精品免费视频| 欧美日韩成人一区二区三区| 99精品国产热久久91蜜凸| 亚洲欧洲日本专区| 欧美日韩免费高清一区色橹橹| 夜夜嗨av一区二区三区四季av| 亚洲日本中文字幕| 国产精品盗摄久久久| 午夜免费电影一区在线观看| 欧美一二区视频| 精品av久久707| 欧美二区在线看| 欧美黑人多人双交| 亚洲视频一二三| 欧美综合77777色婷婷| 亚洲激情啪啪| 在线亚洲自拍| 一区二区在线观看视频在线观看| 亚洲电影中文字幕| 国产精品久久久久99| 久久精品视频网| 欧美成人黑人xx视频免费观看| 一区二区高清在线观看| 午夜精品久久久久久久久久久久 | 亚洲欧美日韩一区二区在线 | 午夜视频在线观看一区二区| 激情久久一区| 宅男噜噜噜66国产日韩在线观看| 国产亚洲视频在线观看| 欧美激情精品久久久久久黑人| 欧美性做爰毛片| 免费在线成人av| 国产精品区一区二区三| 亚洲国产精品一区制服丝袜| 国产日本欧美一区二区| 亚洲国产毛片完整版| 国产精品亚洲一区| 欧美激情a∨在线视频播放| 国产精品久久久久久影视| 欧美大片91| 国产视频一区二区在线观看| 亚洲精品免费在线播放| 在线成人av| 性做久久久久久免费观看欧美| 99国产精品久久| 久久视频一区二区| 亚洲国产成人精品视频| av不卡在线观看| 亚洲国产经典视频| 亚洲淫性视频| 亚洲一区二区黄| 欧美不卡在线视频| 久久综合九九| 国产视频一区免费看| 亚洲一区二区三区激情| 在线综合亚洲欧美在线视频| 免费高清在线一区| 久久久久国产精品一区二区| 国产精品乱人伦一区二区| 99亚洲一区二区| 亚洲精品欧美日韩| 免费永久网站黄欧美| 欧美xxx在线观看| 伊人精品久久久久7777| 亚洲欧美中文在线视频| 欧美一区二视频| 国产精品日日摸夜夜添夜夜av| 99热免费精品| 亚洲综合精品一区二区| 国产精品久久久久99| 亚洲午夜一区二区| 欧美一乱一性一交一视频| 国产精品―色哟哟| 性欧美18~19sex高清播放| 欧美一区二区三区电影在线观看| 国产精品久久久久一区| 亚洲在线观看免费| 久久精品中文字幕免费mv| 狠狠狠色丁香婷婷综合激情| 久久五月激情| 亚洲人成网站999久久久综合| 一本色道久久99精品综合| 欧美精品首页| 中文一区在线| 久久午夜色播影院免费高清| 欲色影视综合吧| 欧美电影电视剧在线观看| 亚洲三级影片| 西瓜成人精品人成网站| 国内精品伊人久久久久av影院 | 91久久久在线| 欧美精品久久99久久在免费线| 亚洲精品一区二区三区不| 国产精品99久久久久久有的能看| 国产精品久久久久av免费| 欧美伊人久久久久久久久影院| 欧美**字幕| 一本一本久久| 国产亚洲综合性久久久影院| 另类春色校园亚洲| 亚洲九九精品| 久久蜜桃香蕉精品一区二区三区| 亚洲国产天堂久久综合网| 国产精品www994| 久久久噜噜噜久噜久久| 99在线精品视频在线观看| 久久在线免费观看视频| 在线亚洲欧美专区二区| 激情综合电影网| 国产精品国产三级国产普通话三级 | 久久免费观看视频| 在线观看视频一区| 欧美日韩系列| 久久久噜噜噜久噜久久| 亚洲天堂偷拍| 乱人伦精品视频在线观看| 日韩亚洲欧美成人一区| 国产亚洲永久域名| 欧美无乱码久久久免费午夜一区| 久久国产主播精品| 亚洲尤物在线视频观看| 亚洲激情欧美| 久久综合久久综合久久综合| 亚洲一区国产视频| 亚洲另类黄色| 亚洲国产成人av| 国产一区二区三区在线免费观看| 欧美日韩一二区| 欧美激情欧美激情在线五月| 久久免费国产精品1| 欧美一区二区三区在|