bzoj1014火星人(字符串hash+splay)

来源:互联网 发布:ltp1端口 编辑:程序博客网 时间:2024/05/21 14:44

表示刚开始1.没有选好mod数2.强制类型转换有问题,然后竟然wa了好几次,

以后用9875321这个质数作为mod数


其余就是代码能力的部分了

#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<cstdlib>#include<iostream>#define debug(x) cout<<#x<<"="<<x<<endlusing namespace std;typedef  long long ll;const ll mod=9875321;int p29[150009],a[150009];char chh[150009];int n,m;int rt,fa[150009],ch[150009][2],v[150009],size[150009],hs[150009],tot;inline int idx(char a)  {return a-'a'+1;}void init(){    p29[0]=1;    for (int i=1;i<=140001;i++) p29[i]=p29[i-1]*29%mod;    a[1]=a[n+2]=hs[0]=0;}void up(int i){    int l=ch[i][0],r=ch[i][1];    size[i]=size[l]+size[r]+1;    hs[i]=(ll)((ll)hs[l]*p29[size[r]+1]%mod+(ll)v[i]*p29[size[r]]%mod+hs[r])%mod;//因为可能爆int,所以应该加(ll),左边的不是ll也没有关系,mod之后保证int以内}/*************************/void rotate(int x){    int y=fa[x],z=fa[y],l,r;    if (ch[y][0]==x) l=0;else l=1;r=l^1;    if (z)    if (ch[z][0]==y) ch[z][0]=x;else ch[z][1]=x;    fa[x]=z;fa[y]=x;fa[ch[x][r]]=y;    ch[y][l]=ch[x][r];ch[x][r]=y;    up(y);}void splay(int x,int k){    int y,z;    while (fa[x]!=k)    {        y=fa[x],z=fa[y];        if (z!=k)        if (ch[z][0]==y^ch[y][0]==x) rotate(x);else rotate(y);        rotate(x);    }    if (k==0) rt=x;    up(x);}/******************************************************************************************/int build(int l,int r,int f){    if (l>r) return 0;    int mid=(l+r)>>1,id=++tot;    fa[id]=f;v[id]=a[mid];    if (l==r)    {        size[id]=1;hs[id]=v[id];        return id;    }    ch[id][0]=build(l,mid-1,id);    ch[id][1]=build(mid+1,r,id);    up(id);    return id;//注意return的是标号}int find(int i,int x){    if (i==0) return 0;    if (size[ch[i][0]]+1==x) return i;    if (size[ch[i][0]]>=x) return find(ch[i][0],x);    else return find(ch[i][1],x-size[ch[i][0]]-1);}int split(int x,int len){    int k=find(rt,x);splay(k,0);    int h=find(rt,x+len+1);splay(h,k);    return hs[ch[h][0]];}bool pan(int x,int y,int len){    int hsx=split(x,len),hsy=split(y,len);    if (hsx==hsy) return true;else return false; }void query(){    int x,y;    scanf("%d%d",&x,&y);    if (x>y) swap(x,y);    int l=1,r=n-y+1,ans=0,mid;    while(l<=r)    {        mid=(l+r)>>1;        if (pan(x,y,mid)) {ans=mid;l=mid+1;}        else r=mid-1;    }    printf("%d\n",ans);}void reset(){    int x,y;    char c[3];    scanf("%d%s",&x,c);y=idx(c[0]);    int k=find(rt,x+1);splay(k,0);    v[k]=y;up(k);}void insert(){    int x,d;    char c[3];    scanf("%d%s",&x,c); d=idx(c[0]);    int k=find(rt,x+1);splay(k,0);    int h=find(rt,x+2);splay(h,k);    ch[h][0]=++tot;    fa[tot]=h;v[tot]=hs[tot]=d;size[tot]=1;    up(h);up(k);n++;}int main(){    scanf("%s",chh);n=strlen(chh);    init();    for (int i=1;i<=n;i++) a[i+1]=idx(chh[i-1]);    rt=build(1,n+2,0);    char c[10];    scanf("%d",&m);    while (m--)    {        scanf("%s",c);        if (c[0]=='Q') query();        if (c[0]=='R') reset();        if (c[0]=='I') insert();    }    return 0;}


0 0