BZOJ-1014: [JSOI2008]火星人prefix(字符串HASH+splay)

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1014

这道题是有修改的,那么SA就不行了,想想之前那个字符串HASH的LCP求法,令hash(i,j)=s(j)27^0+s(j-1)27^1+...+s(i)*(j-i),那么如果hash(i,j)=hash(l,r),那么说明s(i..j)与s(l..r)有很高的概率相同,那么用splay维护hash,然后二分查找判定即可求出LCP。(虽然我不太喜欢字符串HASH这种不是100%的算法就是了,为了不被专门的数据卡WA,建议多取一两个HASH值进行比较)(这道题取26来乘就会WA。。。QaQ...)。

代码(觉得这种题还是递归版splay好写多了):

77094b36acaf2edd2f51958a8f1001e939019335.jpg.png
#include <cstdio>

#include <algorithm>

#include <cstring>

 

using namespace std ;

 

#define MAXN 300100

#define L( t ) left[ t ]

#define R( t ) right[ t ]

#define S( t ) size[ t ]

#define H( t ) Hash[ t ]

#define V( t ) value[ t ]

#define C( t )( t ==L(F( t )))

#define ULL unsigned long long

 

int getstr(char*s ){

    int len =0, ch ;

    for( ch =getchar(  );!( ch >='a'&& ch <='z'); ch =getchar(  ));

    s[++ len ]= ch ;

    for( ch =getchar(  ); ch >='a'&& ch <='z'; ch =getchar(  )) s[++ len ]= ch ;

    return len ;

}

 

char getchr(  ){

    int ch ;for( ch =getchar(  );!(( ch >='A'&& ch <='Z')||( ch >='a'&& ch <='z')); ch =getchar(  ));

    return ch ;

}

 

void getint(int&t ){

    int ch ;for( ch =getchar(  );!( ch >='0'&& ch <='9'); ch =getchar(  ));

    t = ch -'0';

    for( ch =getchar(  ); ch >='0'&& ch <='9'; ch =getchar(  )){

        t *=10, t += ch -'0';

    }

}

 

void putint(int t ){

    if(! t )putchar('0');else{

        int ans[20]; ans[0]=0;

        for(; t ; t /=10) ans[++ ans[0]]= t %10;

        for(int i = ans[0]; i ; i --)putchar('0'+ ans[ i ]);

    }

    putchar('\n');

}

 

int left[ MAXN ], right[ MAXN ], size[ MAXN ];

ULL Hash[ MAXN ], value[ MAXN ], Exp[ MAXN ];

int roof =0, V =0;

 

void update(int t ){

    S( t )=S(L( t ))+S(R( t ))+1;

    H( t )=H(R( t ));

    H( t )+=V( t )* Exp[S(R( t ))];

    H( t )+=H(L( t ))* Exp[S(R( t ))+1];

}

 

void zag(int&t ){

    int k =R( t );

    R( t )=L( k );update( t );

    L( k )= t ;update( k );

    t = k ;

}

 

void zig(int&t ){

    int k =L( t );

    L( t )=R( k );update( t );

    R( k )= t ;update( k );

    t = k ;

}

 

bool splay(int r ,int&t ,bool flag ){

    if(S(L( t ))== r )return true;

    bool w =splay( r <S(L( t ))? r : r -S(L( t ))-1, r <S(L( t ))?L( t ):R( t ),false);

    if(! w ){

        if( r <S(L( t ))){

            if( r <S(L(L( t ))))zig( t );else zag(L( t ));

            zig( t );

        }else{

            r -=S(L( t )),-- r ;

            if( r <S(L(R( t ))))zig(R( t ));else zag( t );

            zag( t );

        }

    }else if( flag ){

        if( r <S(L( t )))zig( t );else zag( t );

    }

    return w ^true;

}

 

void Insert(int k ,int&t ){

    if(! t ){

        t =++ V ;

        L( t )=R(0)=0;

        V( t )=H( t )= k ;

        S( t )=1;

        return;

    }

    Insert( k ,R( t ));

    update( t );

}

 

char s[ MAXN ];

int n , m ;

 

void Init(  ){

    Exp[0]=1;

    for(int i =0; i ++< n + m ;) Exp[ i ]= Exp[ i -1]*27;

    L(0)=R(0)=S(0)=0,V(0)=H(0)=0;

    Insert(0, roof );

    for(int i =0; i ++< n ;){

        Insert(int( s[ i ])-int('0'), roof );

        splay(S( roof )-1, roof ,true);

    }

    Insert(0, roof );

}

 

ULL cp(int l ,int r ){

    splay( l -1, roof ,true);

    splay( r - l +1,R( roof ),true);

    return H(L(R( roof )));

}

 

int Query(int x ,int y ){

    if( x > y )swap( x , y );

    int len =S( roof )-2;

    int l =0, r = len - y +2;

    while( r - l >1){

        int mid =( l + r )>>1;

        if(cp( x , x + mid -1)==cp( y , y + mid -1)) l = mid ;else r = mid ;

    }

    return l ;

}

 

int main(  ){

    n =getstr( s );getint( m );

    Init(  );

    while( m --){

        char c =getchr(  );

        if( c =='Q'){

            int x , y ;getint( x ),getint( y );

            putint(Query( x , y ));

        }else if( c =='R'){

            int x ;getint( x ); c =getchr(  );

            splay( x , roof ,true);

            V( roof )= c -'0';

            update( roof );

        }else{

            int x ;getint( x ); c =getchr(  );

            splay( x , roof ,true);

            splay(0,R( roof ),true);

            Insert(int( c )-int('0'),L(R( roof )));

            update(R( roof ));update( roof );

        }

    }

    return 0;

}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,027评论 0 2
  • 昨天,妈妈从市场带回一只小乌龟,我很高兴! 小乌龟只有巴掌那么大,全身是深灰色的,背上有几点彩色的小圆点。每到晚上...
    李丰名阅读 284评论 0 6
  • 在这个,荒无的世界里,很多人,都活在,自己的回忆里,至少,那回忆可以让迷茫的心找到一丝温存,漫漫的,总是,这样漫漫...
    大头爸爸的号阅读 244评论 0 0
  • 《妈妈教的数学》何梦瑶父母申请书 一,申请人:何梦瑶父母(何梦瑶,女宝,26个月) 二,得知《妈妈教的数学52讲》...
    禾苗妈妈_5942阅读 772评论 0 0
  • 春雨初歇, 春池初涨, 春风十里,不如你。
    刘懋伟阅读 179评论 0 1