P4036 [JSOI2008]火星人 (平衡树,字符串哈希)
看到题目以为是奇怪的待修改SA,然而并没有想到怎么修改。
正解:
看到有插入操作,就可以想平衡树了。
然后两个后缀的
于是就在平衡树上维护一段区间的哈希值,具体的push_up方法长这样:
hs[x]=hs[lc]*pw[sz[rc]+1]+val[x]*pw[sz[rc]]+hs[rc];
然后这道题就做完了。
然而,因为我平衡树写得太拉,插入操作乱写,导致调了两个多小时.......
这是错误代码:
Find(x);//意思是把x旋上来了后,直接把新节点跟x和x的右儿子连边了...
val[++newp]=c-'a'+1;
ch[newp][0]=rt,ch[newp][1]=ch[rt][1];
fa[rt]=fa[ch[rt][1]]=newp,ch[rt][1]=0;
Push_Up(rt),rt=newp,Push_Up(rt);