bzoj1014: [JSOI2008]火星人prefix splay
2014-12-29 20:47
323 查看
spaly+hash,我的hash方式有点慢。。。。。
#include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <iostream> using namespace std; #define maxn 200000 typedef long long sint; #define mod 9875321 int tr[maxn][2],fa[maxn],id[maxn]; int siz[maxn],v[maxn],h[maxn]; int p[maxn]; int n,m,root,len; char ch[maxn]; inline int getint() { char c; int res; while (c = getchar(), ('0' > c || c > '9') && c != '-'); int flag=1; if(c=='-') flag=-1,res=0; else res=c-'0'; while (c = getchar(), '0' <= c && c <= '9') res = res * 10 + c - '0'; return res*flag; } void pushup(int rt) { int l=tr[rt][0];int r=tr[rt][1]; siz[rt]=siz[l]+siz[r]+1; h[rt] = h[l] +(sint) v[rt]*p[siz[l]]%mod+(sint)p[siz[l]+1]*h[r]%mod; h[rt] %=mod; } void rotateup(int x,int& rt) { int l,r,y,z; y=fa[x],z=fa[y]; if(tr[y][0]==x) l=0; else l=1;r=l^1; if(y==rt) rt=x; else { if(tr[z][0]==y) tr[z][0]=x; else tr[z][1]=x; } fa[x]=z;fa[y]=x;fa[tr[x][r]]=y; tr[y][l]=tr[x][r];tr[x][r]=y; pushup(y),pushup(x); } void splay(int x,int& rt) { int y,z; while(x!=rt) { y=fa[x],z=fa[y]; if(y!=rt) { if((tr[y][0]==x)^(tr[z][0]==y)) rotateup(x,rt); else rotateup(y,rt); } rotateup(x,rt); } } void build(int l,int r,int f) { if(l>r) return; if(l==r) { fa[l]=f; siz[l]=1;h[l]=v[l]=ch[l]-'a'+1; if(l<f) tr[f][0]=l; else tr[f][1]=r; return; } int mid=(l+r)>>1; fa[mid]=f; build(l,mid-1,mid); build(mid+1,r,mid); v[mid]=ch[mid]-'a'+1;fa[mid]=f; pushup(mid); if(mid<f) tr[f][0]=mid; else tr[f][1]=mid; } int select(int x,int rk) { int l=tr[x][0],r=tr[x][1]; int rak=siz[l]+1; if(rak==rk) return x; if(rak>rk) return select(l,rk); else return select(r,rk-rak); } int query(int x,int val) { int l=select(root,x),r=select(root,x+val+1); splay(l,root);splay(r,tr[l][1]); int z=tr[r][0]; return h[z]; } int solve(int x,int y) { int l=1,r=min(len-x,len-y)-1,ans=0; while(l<=r) { int mid=(l+r)>>1; if(query(x,mid)==query(y,mid))l=mid+1,ans=mid; else r=mid-1; } return ans; } void insert(int k,int val) { int x=select(root,k+1),y=select(root,k+2); splay(x,root);splay(y,tr[x][1]); int z=++len;tr[y][0]=z;fa[z]=y;v[z]=val; pushup(z);pushup(y);pushup(x); } int main() { scanf("%s",ch+2); n=strlen(ch+2); p[0]=1; for(int i=1;i<=150020;i++) p[i]=p[i-1]*27%mod; build(1,n+2,0);len=n+2; root=(n+3)>>1; scanf("%d",&m); int x,y; char s[2],d[2]; for(int i=1;i<=m;i++) { scanf("%s",s+1); x=getint(); switch(s[1]) { case 'Q':y=getint();printf("%d\n",solve(x,y));break; case 'R': { scanf("%s",d+1);x=select(root,x+1);splay(x,root); v[root]=d[1]-'a'+1;pushup(root);break; } case 'I':scanf("%s",d+1);insert(x,d[1]-'a'+1);break; } } return 0; }
相关文章推荐
- bzoj 1014 [JSOI2008]火星人prefix(splay+hash)
- [BZOJ1014][JSOI2008]火星人prefix splay+二分+hash
- bzoj1014: [JSOI2008]火星人prefix(splay+hash+二分)
- [BZOJ]1014: [JSOI2008]火星人prefix splay+hash+二分
- 【BZOJ】1014: [JSOI2008]火星人prefix(splay+hash+二分+lcp)
- [BZOJ1014][JSOI2008]火星人prefix(hash+splay)
- BZOJ 1014 JSOI2008 火星人prefix Splay+Hash+二分
- BZOJ 1014: [JSOI2008]火星人prefix( splay + hash )
- [BZOJ1014] [JSOI2008]火星人prefix && splay+字符串hash 重写版
- BZOJ 1014 JSOI 2008 火星人prefix Splay维护字符串Hash + 二分
- BZOJ_1014_[JSOI2008]_火星人prefix_(Splay+LCP_Hash+二分)
- [BZOJ 1014] [JSOI2008] 火星人prefix 【Splay + Hash】
- bzoj1014: [JSOI2008]火星人prefix splay+hash
- 【bzoj1014】[JSOI2008]火星人prefix splay+hash+二分
- bzoj 1014: [JSOI2008]火星人prefix (hash+splay)
- 【BZOJ1014】【JSOI2008】火星人prefix Splay处理区间,hash+dichotomy(二分)check出解
- BZOJ 1014 JSOI2008 火星人prefix Splay+Hash+二分
- 【伸展树(splay)】[JSOI2008][HYSBZ/BZOJ1014]火星人prefix
- 【bzoj1014】【jsoi2008】【火星人prefix】【splay+hash】
- 【splay】BZOJ 1014: [JSOI2008]火星人prefix