Poj2758 Checking the Text
2017-12-01 19:06
246 查看
题目传送门
经典的数据结构维护字符串哈希
这里用了很慢很慢的splay各种T(也可能是死循环)
不过没办法因为会写splay的能力还是要有的
经典的数据结构维护字符串哈希
这里用了很慢很慢的splay各种T(也可能是死循环)
不过没办法因为会写splay的能力还是要有的
#pragma GCC opitmize("O3") #pragma G++ opitmize("O3") #include<stdio.h> #include<string.h> #include<algorithm> #define N 100010 #define LL long long #define son(x) (x==ch[f[x]][1]) using namespace std; LL h[N],bas[N]={1}; int f[N],ch[N][2],sz[N],v[N]; int n,m,cnt=0,rt=0,q; inline int newnode(int k){ ++cnt; h[cnt]=v[cnt]=k; sz[cnt]=1; return cnt; } inline void ps(int x){ sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1; h[x]=(h[ch[x][0]]*131+v[x])*bas[sz[ch[x][1]]]+h[ch[x][1]]; } inline void rot(int x){ int p=f[x],g=f[p],d=son(x); ch[p][d]=ch[x][!d]; f[ch[p][d]]=p; ch[x][!d]=p; f[p]=x; f[x]=g; if(g) ch[g][p==ch[g][1]]=x; ps(p); ps(x); } inline void splay(int x,int r=0){ for(int p;(p=f[x])!=r;rot(x)) if(f[p]!=r && son(x)==son(p)) rot(p); if(!r) rt=x; } inline int select(int k,int x=rt){ for(int w;x;){ w=sz[ch[x][0]]+1; if(w==k) return x; if(k<w) x=ch[x][0]; else k-=w,x=ch[x][1]; } } inline int gRank(int k,int x=rt){ int r=1; for(;x;){ if(v[x]>=k) x=ch[x][0]; else{ r+=sz[ch[x][0]]+1; x=ch[x][1]; } } return r; } inline int rank(int x){ int r=sz[ch[x][0]]+1; for(;x;x=f[x]) if(son(x)) r+=sz[ch[f[x]][0]]+1; return r; } inline void Llink(int x,int v){ f[ch[x][0]=v]=x; ps(x); } inline void Rlink(int x,int v){ f[ch[x][1]=v]=x; ps(x); } inline LL gH(int x,int len){ splay(select(x-1)); splay(select(x+len),rt); return h[ch[ch[rt][1]][0]]; } int main(){ char c[50010],o[3]; scanf("%s%d",c,&n); m=strlen(c); rt=newnode(0); for(int i=1;i<50100;++i) bas[i]=bas[i-1]*131; for(int i=0;i<m;++i){ Llink(newnode(c[i]),rt); rt=cnt; } Llink(newnode(0),rt); rt=cnt; for(int x,y;n--;){ scanf("%s",o); if(*o=='I'){ scanf("%s%d",o,&x); x=min(x,sz[rt]-1); splay(select(x)); splay(select(x+1),rt); Llink(ch[rt][1],newnode(*o));ps(rt); } else { scanf("%d%d",&x,&y); ++x; ++y; int a=rank(x),b=rank(y); if(x==y){printf("%d\n",sz[rt]-max(a,b));continue;} int l=0,r=sz[rt]-max(a,b); for(int M;l<r;){ M=l+r+1>>1; if(gH(a,M)==gH(b,M)) l=M; else r=M-1; } printf("%d\n",l); } } }
相关文章推荐
- poj2758 checking the text
- 后缀数组 - poj2758 Checking the Text
- BZOJ 2258 pku2758 Checking the Text 文本校对 Splay+Hash+二分
- POJ 2758 Checking the Text(Hash+二分答案)
- POJ 2758 Checking the Text
- BZOJ 2258 pku2758 Checking the Text 文本校对 Splay+Hash
- pku2758 Checking the Text
- POJ 2758 Checking the text
- bzoj2258 pku2758 Checking the Text 文本校对
- POJ-2758 checking the text(哈希+二分)
- bzoj2258: pku2758 Checking the Text 文本校对 hash+二分
- poj 2758 Checking the Text (后缀数组应用)
- bzoj2258 pku2758 Checking the Text 文本校对(Hash+二分+splay)
- poj 2758 && BZOJ 2258 Checking the Text 文本校对
- bzoj 2258: pku2758 Checking the Text 文本校对 hash+二分
- poj 2758: Checking the Text(二分+Hash)
- poj 2758 Checking the text
- POJ 2758 Checking the Text
- 【BZOJ】【P2258】【pku2758 Checking the Text 文本校对】【题解】【hash】
- poj2758 checking the text