hdu 4763 Theme Section(擴充kmp+線段樹)

來源:互聯網
上載者:User

hdu 4763 Theme Section(擴充kmp+線段樹)


題目大意:給出一個字串,問這個字串的最長Theme Section是多長,Theme Section要符合以下條件,必須出現在字串的開頭,結尾,和中間,而且不能有重疊。

解題思路:我們學校有隊伍用的暴力kmp過的,我後來看了下他的代碼,似乎是不行的。說說我的思路,我們擴充kmp求出一個next數組,next[i]表示以i為開頭的尾碼與該字串的最長公用首碼的長度。然後從後往前枚舉長度為i的尾碼,若這個尾碼與字串的最長公用首碼等於i,那麼它有可能成為答案,它要能成為答案,那麼我們還要在[i,len-2*i]這個區間裡找出一個尾碼,這個尾碼與字串的最長公用首碼要大於等於i,這個最大值,我本來想用rmp預先處理,然後o(1)回答,但是空間複雜度是過不了的,所以就用線段樹詢問好了。整體時間複雜度是o(nlogn)的,如果大資料不超過10組的話,應該是沒問題的。

#include<stdio.h>#include<string.h>#include<algorithm>#define lson l , m , rt << 1#define rson m + 1 , r , rt << 1 | 1using namespace std ;const int maxn = 1111111 ;int max ( int a , int b ) { return a > b ? a : b ; }int p[maxn] ;int mx[maxn<<2] ;void get_p (const char *T){     int len=strlen(T),a=0;     int i , k ;     p[0]=len;     while(a<len-1 && T[a]==T[a+1]) a++;     p[1]=a;     a=1;     for( k=2;k<len;k++){         int fuck=a+p[a]-1,L=p[k-a];         if( (k-1)+L >= fuck){             int j = (fuck-k+1)>0 ? (fuck-k+1) : 0;             while(k+j<len && T[k+j]==T[j]) j++;             p[k]=j;             a=k;          }          else p[k]=L;      }}inline void push_up ( int rt ) {    mx[rt] = max ( mx[rt<<1] , mx[rt<<1|1] ) ;}void build ( int l , int r , int rt ) {    if ( l == r ) {        mx[rt] = p[l] ;        return ;    }    int m = ( l + r ) >> 1 ;    build ( lson ) ;    build ( rson ) ;    push_up ( rt ) ;}int query ( int a , int b , int l , int r , int rt ) {    if ( a <= l && r <= b ) return mx[rt] ;    int m = ( l + r ) >> 1 ;    int ret = 0 ;    if ( a <= m ) ret = query ( a , b , lson ) ;    if ( m < b ) ret = max ( ret , query ( a , b , rson ) ) ;    return ret ;}char s[maxn] ;int main () {    int t , i ;    scanf ( "%d" , &t ) ;    while ( t -- ) {        scanf ( "%s" , s ) ;        get_p ( s ) ;        int n = strlen ( s ) ;        build ( 0 , n - 1 , 1 ) ;        int ans = 0 ;        for ( i = 1 ; i <= n / 3 ; i ++ ) {            if ( p[n-i] == i ) {                if ( query ( i , n - ( 2 * i ) ,  0 , n - 1 , 1 ) >= i ) ans = i ;            }        }        printf ( "%d\n" , ans ) ;    }    return 0 ;}


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.