神奇代码求条,玄关
  • 板块灌水区
  • 楼主Lian_zy
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/27 18:05
  • 上次更新2024/12/27 18:35:03
查看原帖
神奇代码求条,玄关
923248
Lian_zy楼主2024/12/27 18:05

ABC331F,线段树代码查了好久都没查出问题,AC12WA13

#include<bits/stdc++.h>
#define N 1000005
#define ull unsigned long long
using namespace std;

struct node{
	int l,r;
	ull val1,val2;//正反hash值
}tmp,t[N<<2];
ull b[N];
char c,str[N];
int n,q,l,r,x,op;
void push_up(node &k,node ls,node rs){
	k.val1=ls.val1*b[rs.r-rs.l+1]+rs.val1;
	k.val2=ls.val2+rs.val2*b[ls.r-ls.l+1];
	return;
}
void build(int x,int l,int r){
	t[x].l=l;
	t[x].r=r;
	if(l==r){
		t[x].val1=str[l];
		t[x].val2=str[l];
		return;
	}
	int mid=l+r>>1;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	push_up(t[x],t[x<<1],t[x<<1|1]);
	return;
}
void update(int x,int p,int c){
	int L=t[x].l;
	int R=t[x].r;
	if(L==R){
		t[x].val1=t[x].val2=c;
		return;
	}
	int mid=L+R>>1;
	update(x<<1|p>mid,p,c);
	push_up(t[x],t[x<<1],t[x<<1|1]);
	return;
}
node query(int x,int l,int r){
	int L=t[x].l;
	int R=t[x].r;
	if(l<=L&&R<=r)return t[x];
	int mid=L+R>>1;
	node ans;
	if(r<=mid)return query(x<<1,l,r);
	if(l>mid)return query(x<<1|1,l,r);
	push_up(ans,query(x<<1,l,r),query(x<<1|1,l,r));
	return ans;
}
int main(){
	scanf("%d%d %s",&n,&q,str+1);
	b[0]=1;
	for(int i=1;i<=n;i++)b[i]=b[i-1]*131;
	build(1,1,n);
	while(q--){
		scanf("%d",&op);
		if(op==1){
			scanf("%d %c",&x,&c);
			update(1,x,c);
		}else{
			scanf("%d%d",&l,&r);
			tmp=query(1,l,r);
			if(tmp.val1==tmp.val2)puts("Yes");
			else puts("No");
		}
	}
	return 0;
}
2024/12/27 18:05
加载中...