zoukankan      html  css  js  c++  java
  • Poj2758 Checking the Text

    题目传送门

    经典的数据结构维护字符串哈希

    这里用了很慢很慢的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
    ",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
    ",l);
    		}
    	}
    }

  • 相关阅读:
    调用其他类的方法
    CString中 format、trimLeft和trimright、trim 和FindOneOf用法
    GetAsyncKeyState()& 0x8000
    C++打开剪切板,获取剪切板数据
    CString比较不区分大小写
    C++ string中find() 用法
    CString数组和CStringArray
    nested exception is java.io.FileNotFoundException: Could not open ServletContext resource
    SQLPlus获取oracle表操作SQL
    XShell实现服务器端文件的上传下载
  • 原文地址:https://www.cnblogs.com/Extended-Ash/p/9477183.html
Copyright © 2011-2022 走看看