• <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>
            上次說,LCS有O(n^2 / logn)的解法。這個解法是在字符集不大的情況下,先預(yù)處理,再用位運算做狀態(tài)轉(zhuǎn)移。
            唐文斌曾經(jīng)翻譯過一篇論文,專門討論這個問題。

            應(yīng)richardxx的要求,我把那篇論文貼在這里:
            基于位運算的最長公共子序列算法

            下面是練習(xí)題(n = 10000 的LCS)
            http://acm.whu.edu.cn/oak/problem/problem.jsp?problem_id=1210

            和我的解答

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

            #define    WLEN      32 
            #define    LOGWLEN      5 
            #define    SMAX      16384 
            #define    BITMAX      512 
            #define    ALPHASIZE 128 

            typedef unsigned 
            int WORD; 
            typedef 
            char INDEX; 

            int nwords; 
            WORD bit1[BITMAX]; 
            WORD bit2[BITMAX]; 
            WORD a_strings[ALPHASIZE][BITMAX]; 
            WORD 
            *pb1,*pb2,*t1; 

            WORD bitmask[LOGWLEN]
            ={0x55555555,0x33333333,0x0f0f0f0f,0x00ff00ff,0x0000ffff}

            void alphastrings(INDEX *s,int len) 
                register INDEX 
            *p; 
                register 
            int i,j; 

                
            for (i=0;i<ALPHASIZE;i++for (j=0;j<nwords;j++) a_strings[i][j]=0
                p
            =s; 
                j
            =len; 
                
            for (i=0;i<j;i++) a_strings[*(p++)][i/WLEN]|=1<<(i%WLEN); 
                 
                
            return
            }
             

            void bitops(WORD *last,WORD *cur,INDEX index) 
                register WORD x,y; 
                register 
            int j; 
                register WORD 
            *a_s; 
                register WORD top_borrow,bottombit; 

                a_s
            =&a_strings[index][0]; 
                bottombit
            =1
                
            for (j=0;j<nwords;j++
                    y
            =*(last++); 
                    x
            =y|*(a_s++); 
                    top_borrow
            =(y>>(WLEN-1))&0x1
                    y
            =((y<<1)|bottombit); 
                    
            if (x<y) top_borrow=1
                    
            *(cur++)=x&((x-y)^x); 
                    bottombit
            =top_borrow; 
                }
             
                 
                
            return
            }
             

            int bitcount(WORD *wp) 
                register WORD w,count; 
                register 
            int j,rshift,i; 

                count
            =0
                
            for (i=0;i<nwords;i++
                    w
            =*(wp++); 
                    rshift
            =1
                    
            for (j=0;j<LOGWLEN;j++
                        w
            =(w&bitmask[j])+((w&~bitmask[j])>>rshift); 
                        rshift
            <<=1
                    }
             
                    count
            +=w; 
                }
             
                 
                
            return count; 
            }
             

            int bitlcs(INDEX *a,int lena,INDEX *b,int lenb) 
                register 
            int i; 
                register INDEX 
            *pbstring; 
                register 
            int j,k; 

                nwords
            =(lena+WLEN-1)/WLEN; 
                alphastrings(a,lena); 
                pb1
            =&bit1[0]; 
                
            for (i=0;i<nwords;i++*pb1++=0
                pb1
            =&bit1[0]; 
                pb2
            =&bit2[0]; 
                pbstring
            =b; 
                
            for (i=1;i<=lenb;i++
                    bitops(pb1,pb2,
            *(pbstring++)); 
                    t1
            =pb1; pb1=pb2; pb2=t1; 
                }
             
                 
                
            return bitcount(pb1); 
            }
             

            int main() 
                
            char sa[SMAX],sb[SMAX]; 
                
            while (scanf("%s%s",sa,sb)!=EOF) printf("%d\n",bitlcs(sa,strlen(sa),sb,strlen(sb))); 
                
            return 0
            }
             
            posted on 2007-10-19 16:56 Felicia 閱讀(1383) 評論(5)  編輯 收藏 引用 所屬分類: 動態(tài)規(guī)劃
            Comments
            • # re: [動態(tài)規(guī)劃]O(n^2 / logn)的LCS
              richardxx
              Posted @ 2007-12-30 03:37
              想請問下唐的論文的題目是?
              望告知。。
                回復(fù)  更多評論   
            • # re: [動態(tài)規(guī)劃]O(n^2 / logn)的LCS
              Felicia
              Posted @ 2007-12-30 10:49
              我已經(jīng)修改了文章,把那個論文上傳了。  回復(fù)  更多評論   
            • # re: [動態(tài)規(guī)劃]O(n^2 / logn)的LCS
              richardxx
              Posted @ 2007-12-31 13:38
              很感謝felicia! :> :P  回復(fù)  更多評論   
            • # re: [動態(tài)規(guī)劃]O(n^2 / logn)的LCS
              ecnu_zp
              Posted @ 2008-07-15 10:55
              太牛了.  回復(fù)  更多評論   
            • # re: [動態(tài)規(guī)劃]O(n^2 / logn)的LCS
              NH2T
              Posted @ 2009-07-03 16:54
              thank u very much
              i love you  回復(fù)  更多評論   
             
            久久精品国产亚洲AV不卡| 91精品日韩人妻无码久久不卡| 青青青青久久精品国产h久久精品五福影院1421| 国内精品九九久久久精品| 人妻少妇久久中文字幕一区二区| 久久免费小视频| 伊人丁香狠狠色综合久久| 久久国产影院| 99国产欧美精品久久久蜜芽| 久久国产影院| 69国产成人综合久久精品| 一本色综合久久| 国产精品嫩草影院久久| 一本色道久久88—综合亚洲精品 | 久久精品国产亚洲av麻豆蜜芽| 国产精品久久久久AV福利动漫| 色天使久久综合网天天| 伊人久久综合热线大杳蕉下载| 精品国产99久久久久久麻豆| 国产午夜精品久久久久九九电影| 亚洲国产美女精品久久久久∴| 亚洲va久久久久| AA级片免费看视频久久| 久久无码人妻一区二区三区| 国产精品99久久久久久宅男小说| 久久久av波多野一区二区| 99久久精品免费看国产一区二区三区 | 99久久精品午夜一区二区 | 久久青青草原精品国产不卡| 久久婷婷五月综合97色一本一本| 久久久精品波多野结衣| 色综合久久最新中文字幕| 亚洲精品无码成人片久久| 中文字幕精品无码久久久久久3D日动漫| 久久AV高清无码| 97久久天天综合色天天综合色hd | 久久国产免费直播| 欧美成a人片免费看久久| 日韩精品无码久久一区二区三| 久久99精品久久久久久水蜜桃| 久久夜色精品国产|