学了一下模板,照着 CSDN 一篇题解打的。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q;
string a;
struct node{
int l,r;
mutable char v;
const bool operator<(const node &a)const{
return l<a.l;
}
};
set<node >s;
set<node >::iterator split(int pos){
set<node >::iterator it=s.lower_bound({pos});
if(it!=s.end()&&it->l==pos)
return it;
it--;
if(it->r<pos)
return s.end();
int l=it->l;
int r=it->r;
char v=it->v;
s.erase(it);
s.insert({l,pos-1,v});
return s.insert({pos,r,v}).first;
}
void assign(int l,int r,char k){
set<node >::iterator itr=split(r+1),itl=split(l);
s.erase(itl,itr);
s.insert({l,r,k});
}
void query(int l,int r){
set<node >::iterator itr=split(r+1),itl=split(l);
if(l!=r){
set<node >::iterator it=itl,last=itl;
it++;
for(;it!=itr;it++,last++)
if(it->v!=last->v){
puts("No");
int _l=itl->l;
int _r=last->r;
char _v=last->v;
s.erase(itl,it);
s.insert({_l,_r,_v});
return ;
}
}
char _v=itl->v;
s.erase(itl,itr);
s.insert({l,r,_v});
if(l==1||r==n){
puts("Yes");
return ;
}
set<node >::iterator ib=split(r+1),ia=split(l-1);
puts((ia->v!=ib->v)?"Yes":"No");
}
signed main(){
scanf("%lld\n",&n);
cin>>a;
for(int i=1;i<=n;i++){
int l=i;
int r=i;
while(a[l]==a[i])
r=++i;
s.insert({l,r,a[--i]});
}
scanf("%lld\n",&q);
while(q--){
int l,r;
char op,k;
scanf("%c",&op);
if(op=='A'){
scanf("%lld %lld %c\n",&l,&r,&k);
assign(l,r,k);
}
else{
scanf("%lld %lld",&l,&r);
query(l,r);
}
}
return 0;
}