1 条题解

  • 1
    @ 2023-10-27 15:30:29

    暴力 string 维护即可。

    时间复杂度:O(nm)O(nm)(大概是 1e10 的计算量,但远远达不到)。

    #include<bits/stdc++.h>
    using namespace std;
    string s;
    int main(){
    	cin>>s;
    	int m;scanf("%d",&m);
    	while(m--){
    		char op[10],ch[10];int x,y;
    		scanf("%s",op+1);
    		if(op[1]=='Q'){
    			scanf("%d%d",&x,&y);
    			int cnt=0;
    			for(int i=x-1,j=y-1;s[i]&&s[j]&&(s[i]==s[j]);i++,j++){
    				cnt++;
    			}
    			printf("%d\n",cnt);
    		}
    		if(op[1]=='R'){
    			scanf("%d%s",&x,ch+1);
    			s[x-1]=ch[1];
    		}
    		if(op[1]=='I'){
    			scanf("%d%s",&x,ch+1);
    			s.insert(s.begin()+(x-1)+1,ch[1]);
    		}
    	}
    	return 0;
    }
    

    平衡树维护区间哈希值。

    时间复杂度:O(mlogn)O(m \log n)

    #include<bits/stdc++.h>
    #define fa(x) tr[x].fa
    #define lc(x) tr[x].ch[0]
    #define rc(x) tr[x].ch[1]
    using namespace std;
    typedef unsigned long long ULL;
    const int N=2e5+5;
    const ULL Hash=131;
    const int inf=0x3f3f3f3f;
    char str[N];int n;
    ULL p[N];
    void init(){
    	p[0]=1;
    	for(int i=1;i<=N-5;i++){
    		p[i]=p[i-1]*Hash;
    	}
    }
    struct trnode{
    	int val,siz,fa,ch[2];
    	ULL hash;
    }tr[N];
    int root,trlen;
    void pushup(int x){
    	if(!x)return;
    	tr[x].siz=(tr[lc(x)].siz+tr[rc(x)].siz+1);
    	tr[x].hash=tr[lc(x)].hash+tr[x].val*p[tr[lc(x)].siz]+tr[rc(x)].hash*p[tr[lc(x)].siz+1];
    }
    void add(int d,int fa){
    	trlen++;int now=trlen;
    	tr[now]={d,1,fa,0,0,(ULL)d};
    	tr[fa].ch[1]=now;
    	if(!fa)root=now;
    }
    void rotate(int x){
    	int y=fa(x),z=fa(y);
    	int w=(rc(y)==x),v=tr[x].ch[1-w];
    	fa(v)=y,tr[y].ch[w]=v;
    	fa(y)=x,tr[x].ch[1-w]=y;
    	fa(x)=z,tr[z].ch[rc(z)==y]=x;
    	pushup(y),pushup(x);
    }
    void splay(int x,int rt){
    	while(fa(x)!=rt){
    		int y=fa(x),z=fa(y);
    		if(z!=rt){
    			if((rc(z)==y)==(rc(y)==x))
    				rotate(y);
    			else rotate(x);
    		}
    		rotate(x);
    	}
    	if(!rt)root=x;
    }
    int find(int k){
    	int x=root;
    	while(1){
    		if(tr[lc(x)].siz>=k){
    			x=lc(x);
    		}
    		else if(tr[lc(x)].siz+1<k){
    			k=k-tr[lc(x)].siz-1;
    			x=rc(x);
    		}
    		else{
    			return x;
    		}
    	}
    }
    int check(int l,int r){
    	int x=find(l-1),y=find(r+1);
    	splay(y,0),splay(x,y);
    	return tr[rc(x)].hash;
    }
    int query(int x,int y){
    	int l=0,r=n-y+1,ans;
    	while(l<=r){
    		int mid=(l+r)>>1;
    		if(check(x,x+mid-1)==check(y,y+mid-1)){
    			l=mid+1;
    			ans=mid;
    		}
    		else r=mid-1;
    	}
    	return ans;
    }
    void change(int l,int c){
    	int x=find(l);
    	splay(x,0);
    	tr[x].val=c;
    }
    void insert(int l,int c){
    	int x=find(l),y=find(l+1);
    	splay(y,0),splay(x,y);
    	add(c,x);
    	splay(trlen,0);
    }
    int main(){
    	init();
    	scanf("%s",str+1);
    	n=strlen(str+1);
    	add(-inf,0);
    	for(int i=1;i<=n;i++){
    		add(str[i]-'a',i);
    		splay(trlen,0);
    	}
    	add(inf,n+1);
    	splay(trlen,0);
    	n++;
    	int m;scanf("%d",&m);
    	for(int i=1;i<=m;i++){
    		char op[10],ch[10];int x,y;
    		scanf("%s",op+1);
    		if(op[1]=='Q'){
    			scanf("%d%d",&x,&y);
    			x++,y++;
    			if(x>y)swap(x,y);
    			printf("%d\n",query(x,y));
    		}
    		if(op[1]=='R'){
    			scanf("%d%s",&x,ch+1);
    			x++;
    			change(x,ch[1]-'a');
    		}
    		if(op[1]=='I'){
    			scanf("%d%s",&x,ch+1);
    			x++;
    			insert(x,ch[1]-'a');
    			n++;
    		}
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    1014
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    88
    已通过
    26
    上传者