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

Tim's Programming Space  
Tim's Programming Space
日歷
<2010年5月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345
統計
  • 隨筆 - 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 閱讀(1566) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


 
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>
            亚洲精品字幕| 亚洲大片在线| 久久精品亚洲国产奇米99| 欧美黄色免费网站| 久久久噜噜噜久久久| 国产精品视频九色porn| 在线综合亚洲欧美在线视频| 欧美电影免费观看网站| 久久精品国产99精品国产亚洲性色 | 亚洲先锋成人| 欧美日韩精品免费观看视一区二区| 精品91在线| 久久在线视频在线| 久久人人97超碰人人澡爱香蕉| 国产一区二区福利| 羞羞答答国产精品www一本| 亚洲欧美在线一区二区| av成人国产| 国产精品va在线播放| 亚洲影视在线播放| 中文在线一区| 国产精品露脸自拍| 久久成人综合网| 欧美有码视频| 尤妮丝一区二区裸体视频| 蜜桃伊人久久| 欧美二区在线观看| 日韩视频国产视频| 日韩一级免费| 国产区亚洲区欧美区| 久久综合伊人77777麻豆| 久久亚洲精品一区二区| 99精品视频免费观看| 亚洲视频网站在线观看| 国产日韩精品久久久| 免费av成人在线| 欧美精品福利| 香蕉久久夜色精品国产使用方法 | 国产精品久久福利| 欧美一区二区高清| 久久中文精品| 亚洲小视频在线观看| 欧美在线国产精品| 亚洲日本视频| 欧美一区二区网站| 亚洲精品中文字幕在线| 午夜精品久久久久久久99水蜜桃| 极品尤物一区二区三区| 亚洲另类自拍| 在线精品国产欧美| 一本大道av伊人久久综合| 国产日韩高清一区二区三区在线| 欧美激情按摩| 国产日韩欧美精品| 日韩视频一区二区| 在线成人激情视频| 亚洲人www| 国产伦精品一区二区三区视频黑人 | 国产精品午夜久久| 欧美成人精品在线观看| 欧美天天在线| 欧美大秀在线观看| 国产精品一卡二卡| 亚洲国产精品第一区二区三区| 欧美日韩国产成人在线91| 久久久精品视频成人| 欧美aⅴ99久久黑人专区| 欧美一区国产一区| 欧美日韩国产大片| 欧美肥婆在线| 国产亚洲欧洲| 这里只有精品电影| 日韩一级大片| 麻豆精品精华液| 久久免费视频网站| 国产精品视频观看| 日韩一本二本av| 亚洲精品日韩欧美| 久久久亚洲人| 老司机免费视频一区二区| 国产精品理论片| 99re亚洲国产精品| 99精品热视频| 欧美精品免费观看二区| 久久天天躁狠狠躁夜夜av| 国产精品亚洲综合色区韩国| 一本色道久久综合狠狠躁篇的优点 | 欧美成人精品一区二区| 国产亚洲激情在线| 亚洲一区在线视频| 亚洲欧美日韩国产成人精品影院| 欧美日韩午夜激情| 91久久精品国产91久久性色tv| 亚洲高清自拍| 久久躁狠狠躁夜夜爽| 欧美xx69| 亚洲国产精品一区二区三区| 久久精品视频网| 奶水喷射视频一区| 亚洲精品久久久久中文字幕欢迎你 | 99re热这里只有精品视频| 在线一区二区三区做爰视频网站| 欧美巨乳波霸| 一区二区三区精品| 午夜在线视频一区二区区别| 国产精品夜色7777狼人| 午夜精品福利电影| 久久综合狠狠| 亚洲人被黑人高潮完整版| 欧美另类视频| 亚洲男人av电影| 欧美成人激情视频免费观看| 亚洲九九精品| 欧美午夜精品理论片a级按摩| 亚洲一区二区成人| 久久久精品2019中文字幕神马| 亚洲国产91色在线| 欧美日韩三级在线| 欧美一级久久久久久久大片| 欧美激情精品久久久久久免费印度| 日韩视频一区二区三区| 国产精品欧美日韩一区| 欧美一区二区在线播放| 亚洲国内自拍| 欧美一区二区三区免费在线看| 精品福利免费观看| 欧美日在线观看| 久久久久久精| 亚洲免费观看高清完整版在线观看熊| 亚洲视频在线视频| 在线观看视频一区二区| 欧美日韩综合不卡| 久久综合一区| 亚洲在线不卡| 亚洲精品123区| 欧美一区二区三区免费观看| 亚洲日韩欧美一区二区在线| 国产精品视频一区二区高潮| 牛牛国产精品| 先锋亚洲精品| 99精品国产在热久久婷婷| 久久人人九九| 亚洲一区二区高清| 亚洲电影毛片| 国产亚洲激情在线| 欧美图区在线视频| 欧美 日韩 国产在线| 欧美一区二区三区电影在线观看| 亚洲国产美女精品久久久久∴| 久久精品免费电影| 亚洲一级网站| 日韩一级黄色片| 91久久精品国产91性色| 国产一区亚洲| 国产精品美女xx| 欧美日韩伦理在线免费| 玖玖在线精品| 欧美在线观看视频一区二区三区| 亚洲精品免费在线播放| 美女视频一区免费观看| 久久国内精品视频| 亚洲欧美韩国| 中文欧美在线视频| 亚洲精品影视在线观看| 在线免费一区三区| 激情六月综合| 国产亚洲激情| 国产曰批免费观看久久久| 国产精品视频精品视频| 国产精品私拍pans大尺度在线| 欧美日韩伦理在线免费| 欧美日韩你懂的| 欧美日韩视频专区在线播放| 欧美屁股在线| 欧美日韩高清在线一区| 欧美日一区二区在线观看 | 先锋资源久久| 午夜国产欧美理论在线播放| 亚洲欧美不卡| 午夜亚洲激情| 久久狠狠久久综合桃花| 久久国产精品99国产| 久久人人97超碰国产公开结果 | 欧美午夜激情视频| 欧美私人网站| 欧美视频在线免费看| 欧美久久九九| 欧美特黄一区| 国产精品影片在线观看| 国产欧美日韩三区| 国产一区三区三区| 亚洲第一在线| 亚洲免费成人av电影| 亚洲综合电影| 欧美一区日本一区韩国一区| 欧美一区国产二区| 蜜桃精品久久久久久久免费影院| 欧美国产高清| 亚洲欧洲精品天堂一级 | 国产精品对白刺激久久久|