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

gzwzm06

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  1 隨筆 :: 52 文章 :: 17 評論 :: 0 Trackbacks
Memory: 74320K Time: 797MS
Language: C++ Result: Accepted
#include <stdio.h>
#include 
<string>
using namespace std ;

const int MAXN = 200000 ;
const int APSIZE = 30 ;

struct SuffixTreeNode
{
    SuffixTreeNode 
*descendants[APSIZE] ;
    
int m_left[APSIZE], m_right[APSIZE] ;
    SuffixTreeNode 
*suffixLink ;

    SuffixTreeNode()
    
{
        
for ( int i = 0 ; i < APSIZE ; ++i )
        
{
            m_left[i] 
= -1 ;
        }

    }

}
 ;

SuffixTreeNode g_STNode[MAXN] ;
int g_Level = 0 ;

SuffixTreeNode
* NewSuffixTreeNode()
{
    SuffixTreeNode 
*ptr = &g_STNode[g_Level++] ;

    
return ptr ;
}


SuffixTreeNode 
*root ;
        
struct UkkonenSuffixTree
{
    
    
int offset ;
    
int Lt ;

    
string T ;

    
bool endPoint ;

    UkkonenSuffixTree(
int from)
    
{
        Lt 
= 1 ;
        offset 
= from ;
    }

    
    SuffixTreeNode
* TestAndSplit( SuffixTreeNode *p, int i )
    
{
        
int Rt = i - 1 ;
        
if ( Lt <= Rt )
        
{
            
int pos = T.at(Lt) - offset ;
            SuffixTreeNode
* pp = p->descendants[pos] ;
            
int lt = p->m_left[pos] ;
            
int rt = p->m_right[pos] ;

            
if ( T.at(i) == T.at( lt + Rt - Lt + 1 ) )
            
{
                endPoint 
= true ;
                
return p ;
            }

            
else {
                pos 
= T.at(lt) - offset ;
                SuffixTreeNode 
*= p->descendants[pos] = NewSuffixTreeNode() ;
                p
->m_right[pos] = lt + Rt - Lt ;
                pos 
= T.at(lt + Rt - Lt + 1- offset ;
                r
->descendants[pos] = pp ;
                r
->m_left[pos] = lt + Rt - Lt + 1 ;
                r
->m_right[pos] = rt ;
                endPoint 
= false ;
                
return r ;
            }

        }

        
else if ( p->m_left[T.at(i) - offset] == -1 )
        
{
            endPoint 
= false ;
        }

        
else
            endPoint 
= true ;
        
return p ;
    }


    SuffixTreeNode
* FindCanonicalNode( SuffixTreeNode *p, int Rt )
    
{
        
if ( Rt >= Lt )
        
{
            
int pos = T.at(Lt) - offset ;
            SuffixTreeNode 
*pp = p->descendants[pos] ;
            
int lt = p->m_left[pos] ;
            
int rt = p->m_right[pos] ;
            
while ( rt - lt <= Rt - Lt )
            
{
                Lt 
= Lt + rt - lt + 1;
                p 
= pp ;
                
if ( Lt <= Rt )
                
{
                    pos 
= T.at(Lt) - offset ;
                    pp 
= p->descendants[pos] ;
                    lt 
= p->m_left[pos] ;
                    rt 
= p->m_right[pos] ;
                    
if ( p == root )
                        pp 
= root ;
                }

            }

        }


        
return p ;
    }


    SuffixTreeNode
* Update( SuffixTreeNode *p, int i )
    
{
        SuffixTreeNode 
*prev = NULL , *= TestAndSplit( p, i ) ;

        
while ( !endPoint )
        
{
            
int pos = T.at(i) - offset ;
            r
->m_left[pos] = i ;
            r
->m_right[pos] = T.length() - 1 ;

            
if ( prev != NULL )
                prev
->suffixLink = r ;
            prev 
= r ;

            
if ( p == root )
                Lt
++ ;
            
else
                p 
= p->suffixLink ;

            p 
= FindCanonicalNode( p, i - 1 ) ;
            r 
= TestAndSplit( p, i ) ;

        }


        
if ( prev != NULL )
            prev
->suffixLink = p ;
        
return p ;
    }


    
void Run( string text )
    
{
        T 
= text ;
        
int n = T.length() , pos = T.at(0- offset ;

        root 
= NewSuffixTreeNode() ;
        root
->suffixLink = root ;
        
        root
->m_left[pos] = 0 ;
        root
->m_right[pos] = n - 1 ;
        
        SuffixTreeNode 
*canonicalNodeAP = root , *canonicalNodeEP ;
        
for ( int i = 1 ; i < n ; ++i )
        
{
            canonicalNodeEP 
= Update( canonicalNodeAP, i ) ;
            canonicalNodeAP 
= FindCanonicalNode( canonicalNodeEP, i ) ;
        }

    }


}
 ;

int length = 0 , s1length = 0 ;
void TraverseTree(SuffixTreeNode *p, int lt, int len, bool& a, bool& b )
{
    
bool edge1 = false, edge2 = false ;

    
for ( int i = 0 ; i < APSIZE ; ++i )
    
{
        
if ( p->m_left[i] != -1 )
        
{
            
if ( p->descendants[i] == NULL )
            
{
                
if ( p->m_left[i] <= s1length )
                    a 
= edge1 = true ;
                
else
                    b 
= edge2 = true ;
            }

            
else {
                TraverseTree( p
->descendants[i], p->m_left[i],
                    len 
+ (p->m_right[i] - p->m_left[i] + 1) , edge1, edge2 ) ;

                
if ( edge1 )
                    a 
= true ;
                
if ( edge2 )
                    b 
= true ;
            }

            
if ( edge1 && edge2 && len > length )
            
{
                length 
= len ;
            }

        }

    }

}


int FindLongest()
{
    
bool edge1 = false , edge2 = false ;

    TraverseTree( root, 
00, edge1, edge2 ) ;

    
return length ;
}



int main()
{
    
char s1[100000], s2[100000] ;
    gets(s1) ;
    gets(s2) ;
    
int l1 = strlen(s1), l2 = strlen(s2) ;
    s1[l1] 
= '|', s1[l1 + 1= '\0' ;
    s2[l2] 
= '}', s2[l2 + 1= '\0' ;
    
    strcat( s1, s2 ) ;

    s1length 
= l1 ;;
    UkkonenSuffixTree t(
'a') ;
    t.Run(s1) ;

    
int ans = FindLongest() ;

    printf(
"%d\n", ans) ;

    
return 0 ;
}
posted on 2008-11-08 14:15 閱讀(614) 評論(1)  編輯 收藏 引用 所屬分類: 字符串處理

評論

# re: Pku 2774--Long Long Message(后綴樹) 2011-05-15 13:51 dereky
求教大牛,那個Lt屬性是記錄什么的  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            免费人成网站在线观看欧美高清| 欧美激情1区2区| 久久嫩草精品久久久精品| 亚洲免费在线视频一区 二区| 一本色道久久88综合日韩精品| 欧美亚洲视频在线观看| 欧美亚洲在线观看| 久久福利一区| 美腿丝袜亚洲色图| 欧美精品在线观看播放| 国产精品女主播| 韩日欧美一区| 日韩一级大片在线| 羞羞视频在线观看欧美| 美女成人午夜| 一区二区三区日韩欧美| 久久精品国产精品亚洲综合| 欧美v日韩v国产v| 欧美日韩国产一级片| 亚洲精品欧美日韩| 亚洲天堂男人| 久久精品国产亚洲5555| 欧美精品videossex性护士| 国产精品日韩电影| 国产性天天综合网| 99re6这里只有精品| 亚洲欧美日韩在线观看a三区| 免费不卡欧美自拍视频| 日韩视频中文字幕| 久久精品99| 国产精品美女久久久久av超清 | 国产精品免费电影| 在线不卡欧美| 亚洲欧美一区二区三区久久| 欧美大胆成人| 午夜久久久久| 欧美日韩在线亚洲一区蜜芽| 在线播放亚洲一区| 久久精品国产精品亚洲综合| 亚洲精品国久久99热| 亚洲一级片在线看| 欧美日韩一区二| 91久久精品国产91性色tv| 香蕉成人伊视频在线观看 | 一区二区三区我不卡| 一区二区三区欧美成人| 久久亚洲私人国产精品va媚药 | 久久九九电影| 亚洲精品自在久久| 久久亚洲捆绑美女| 韩日在线一区| 亚洲一区精品在线| 欧美成人小视频| 欧美在线视频免费| 国产精品日本一区二区| 欧美日韩国产91| 亚洲毛片av| 久久久水蜜桃| 亚洲一二三四久久| 欧美午夜美女看片| 亚洲肉体裸体xxxx137| 香蕉久久久久久久av网站| 亚洲啪啪91| 欧美日韩大片一区二区三区| 亚洲激精日韩激精欧美精品| 麻豆国产精品一区二区三区 | 老巨人导航500精品| 亚洲少妇在线| 国产精品视频成人| 久久久久久久久岛国免费| 一区二区三区四区五区精品视频| 欧美日韩亚洲在线| 亚洲视频香蕉人妖| 亚洲精品日韩在线观看| 免费在线观看精品| 亚洲激情偷拍| 亚洲肉体裸体xxxx137| 欧美日韩国产色视频| 一本色道精品久久一区二区三区| 日韩视频免费观看高清完整版| 欧美国产日韩精品免费观看| 99视频超级精品| 一区二区三区日韩欧美精品| 国产精品三级视频| 亚洲私人影吧| 亚洲在线视频观看| 国产一区二区在线观看免费播放 | 亚洲精选一区| 亚洲免费观看高清完整版在线观看| 欧美日韩美女在线观看| 亚洲午夜日本在线观看| 国产精品99久久久久久人| 国产日韩精品在线| 欧美成人有码| 亚洲综合色婷婷| 久久久久国产免费免费| 亚洲国产网站| 日韩一级成人av| 国产美女一区| 欧美aa在线视频| 欧美人成在线| 久久久高清一区二区三区| 欧美77777| 欧美一区二区高清| 欧美成人免费在线观看| 先锋影音国产精品| 欧美成人精品一区二区| 欧美影院在线播放| 欧美sm视频| 欧美一区二区视频观看视频| 美乳少妇欧美精品| 亚洲欧美视频| 亚洲承认在线| 日韩一级成人av| 久久久国产精彩视频美女艺术照福利| 亚洲韩国青草视频| 亚洲一区在线免费观看| 亚洲国内精品在线| 亚洲午夜视频在线观看| 亚洲欧洲日韩在线| 久久超碰97中文字幕| 一本久道久久久| 亚洲激情网址| 欧美一区二区三区的| 亚洲中午字幕| 欧美日韩另类字幕中文| 欧美sm重口味系列视频在线观看| 欧美日韩18| 欧美.www| 国内免费精品永久在线视频| 亚洲一区中文| 久久久久久一区二区三区| 久久精品中文| 国产精品久久久久久影院8一贰佰 国产精品久久久久久影视 | 亚洲电影免费在线观看| 亚洲私人影院在线观看| 99精品视频免费全部在线| 欧美一区二区三区四区高清| 亚洲私人影院在线观看| 欧美日韩美女在线观看| 亚洲精品久久7777| 亚洲乱码国产乱码精品精98午夜| 久久久综合网站| 亚洲高清视频在线| 亚洲人体偷拍| 欧美电影免费观看| 欧美国产日韩一区二区| 亚洲国产一区二区三区高清| 久久视频这里只有精品| 久久天天躁狠狠躁夜夜爽蜜月| 国一区二区在线观看| 久久久久久穴| 欧美国产免费| 91久久精品美女| 欧美破处大片在线视频| 亚洲五月婷婷| 久久亚洲视频| 一本久道久久综合狠狠爱| 欧美午夜精品久久久久免费视 | 蜜桃久久av一区| 亚洲国产综合91精品麻豆| 亚洲精品一区二区三区樱花| 欧美日韩国产色站一区二区三区| 夜夜爽www精品| 久久乐国产精品| 亚洲欧洲在线看| 欧美无乱码久久久免费午夜一区| 一区二区三区久久| 久久久久久久综合日本| 亚洲精品国产视频| 国产伦精品一区| 久久精品首页| 精品不卡一区| 欧美一区二区视频在线观看| 欧美亚洲一区在线| 亚洲成人在线免费| 欧美日本视频在线| 午夜欧美精品| 亚洲第一中文字幕| 欧美在线一二三| 亚洲国产精品一区二区第一页| 欧美美女操人视频| 亚洲欧美激情视频| 欧美电影美腿模特1979在线看 | 欧美一区二区免费| 欧美福利一区二区三区| 亚洲一区二区三区国产| 一区在线观看| 国产精品免费观看视频| 免费日韩av| 亚洲欧美日韩电影| 亚洲人成亚洲人成在线观看| 久久看片网站| 先锋影音网一区二区| 亚洲精品日韩在线观看| 国产一区二区三区久久 | 久久女同精品一区二区| 一区二区成人精品| 激情久久中文字幕| 国产精品久在线观看|