• <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>
            posts - 24,  comments - 0,  trackbacks - 0
            看了羅穗騫和許智磊的神作《后綴數(shù)組-處理字符串的有力工具》,《后綴數(shù)組》,一個(gè)講證明,一個(gè)重點(diǎn)講實(shí)現(xiàn),相得益彰。
            看了一周了,稍微明白點(diǎn)了,哎!
            弄得暈頭轉(zhuǎn)向,h[]和height[]的關(guān)系,sa[]和rank[]的關(guān)系,倍增構(gòu)造sa,繼續(xù)學(xué)習(xí)sa;fighting!!
            獻(xiàn)上這兩篇神作供大家交流學(xué)習(xí)
            后綴數(shù)組
            下面一道題,poj1743,最長不重疊重復(fù)子串
            基本用的羅神的摸板
            http://poj.org/problem?id=1743
            按羅神思路二分答案
            下面代碼
            #include<cstdio>
            #include<cstring>
            #include
            <algorithm>
            #include
            <cmath>
            using namespace std;
            const int maxn = 20010;
            int wa[maxn],wb[maxn],wv[maxn],ws[maxn];
            int sa[maxn];int n;
            int cmp(int *r,int a,int b,int l)
            {
                
            return r[a]==r[b]&&r[a+l]==r[b+l];
            }
            void da(int *r,int *sa,int n,int m)
            {
                
            int i,j,p,*x=wa,*y=wb,*t;
                
            for(int i=0;i<m;++i)ws[i]=0;
                
            for(int i=0;i<n;++i)++ws[x[i]=r[i]];
                
            for(int i=1;i<m;++i)ws[i]+=ws[i-1];
                
            for(int i=n-1;i>=0;--i)sa[--ws[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)ws[i]=0;
                    
            for(i=0;i<n;++i)ws[wv[i]]++;
                    
            for(i=1;i<m;++i)ws[i]+=ws[i-1];
                    
            for(i=n-1;i>=0;--i)sa[--ws[wv[i]]]=y[i];
                    
            for(t=x,x=y,y=t,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++;
                }
            //printf("djsfhuisdhfi\n");
                return;
            }
            int rank[maxn],height[maxn];
            void calheight(int *r,int *sa,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)
                
            for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];++k);
                
            return ;
            }
            int check(int k)
            {
                
            int nmin=maxn,nmax=0;
                
            for(int i=1;i<=n;++i)
                {
                    
            if(height[i]<k)
                    {
                        nmin
            =nmax=sa[i];
                    }
                    
            else
                    {
                        nmin
            =nmin<sa[i]?nmin:sa[i];
                        nmax
            =nmax>sa[i]?nmax:sa[i];
                        
            if(nmax-nmin>=k)return 1;
                    }
                }
                
            if(nmax-nmin<k)return 0;
                
            return 1;
            }
            int b_search(int l,int r)
            {
                
            int mid;
                
            for(mid=l+((r-l)>>1);l<=r;mid=l+((r-l)>>1))//這里注意移位運(yùn)算優(yōu)先級(jí)比較低,得加上括號(hào)
                {
                    
            if(check(mid))l=mid+1;else r=mid-1;//printf("djsfhuisdhfi\n");
                }
               
            if(check(mid)) return mid;
               
            return 0;
            }
            int main()
            {
                
            while(~scanf("%d",&n)&&n)
                {
                    
            int num[maxn];
                    
            for(int i=0;i<n;++i)scanf("%d",&num[i]);
                    
            int r[maxn];r[0]=500;
                    
            for(int i=1;i<n;++i)r[i]=num[i]-num[i-1]+100;
                    r[n]
            =0;
                    da(r,sa,n
            +1,501);
                    calheight(r,sa,n);
                    
            int ans=b_search(0,n>>1)+1;
                    
            if(ans>=5)printf("%d\n",ans);
                    
            else puts("0");
                }
                
            return 0;
            }
            繼續(xù)做后綴數(shù)組!!!
            posted on 2011-09-07 10:49 ACSeed 閱讀(221) 評(píng)論(0)  編輯 收藏 引用

            只有注冊用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            <2011年9月>
            28293031123
            45678910
            11121314151617
            18192021222324
            2526272829301
            2345678

            常用鏈接

            留言簿(1)

            隨筆檔案

            偶像的Blog

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            日韩欧美亚洲综合久久影院Ds| 精品久久久无码中文字幕天天| 久久天天躁狠狠躁夜夜avapp| 久久婷婷五月综合成人D啪| 日韩人妻无码精品久久久不卡| 亚洲精品高清久久| 久久毛片一区二区| 国产精品久久久久AV福利动漫| 9999国产精品欧美久久久久久| 一级做a爰片久久毛片看看| 久久久精品2019免费观看| 亚洲精品美女久久久久99小说| 国内精品伊人久久久久777| 女人香蕉久久**毛片精品| 久久这里只有精品首页| 久久久精品久久久久特色影视| 性高湖久久久久久久久| 亚洲午夜精品久久久久久浪潮 | 久久精品国产99国产精品亚洲| 久久精品国产久精国产思思| 欧美大战日韩91综合一区婷婷久久青草| 亚洲国产欧美国产综合久久| 久久精品中文字幕有码| 91精品婷婷国产综合久久| 久久久91精品国产一区二区三区| 亚洲国产精品无码久久久不卡| 蜜臀久久99精品久久久久久| 激情综合色综合久久综合| 亚洲国产精品久久久久| 97久久精品国产精品青草| 久久精品99久久香蕉国产色戒 | 日本精品久久久久影院日本| 国内精品久久久久久久亚洲 | 久久一本综合| 欧美国产精品久久高清| 久久久久亚洲精品男人的天堂| 国产91色综合久久免费分享| 欧美亚洲另类久久综合| 99久久亚洲综合精品网站| 欧美亚洲另类久久综合| 久久久久国产日韩精品网站|