您的位置:首页 > Web前端 > JavaScript

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: