rt,不知道这题是不是真的卡odt了.倒数第二点132ms,求助卡常
#include <bits/stdc++.h>
using namespace std;
inline long long read() {
long long x;bool f;char ch;
for(f=0;!isdigit(ch=getchar());f=ch=='-');
for(x=ch-48;isdigit(ch=getchar());x=x*10+ch-48);
return f?-x:x;
}
inline void print(long long x,char las) {
if(!x) {
putchar(48),putchar(las);
return ;
}
if(x<0) putchar('-'),x=-x;
int ls[20],k=0;
while(x) ls[++k]=x%10,x/=10;
while(k) putchar(ls[k--]+48);
putchar(las);
return ;
}
int n=read(),m=read();
struct Node_t {
int l,r;
mutable int v;
inline Node_t(const int&ll,const int&rr,const int&vv) : l(ll),r(rr),v(vv) {}
inline bool operator<(const Node_t&ls) const {
return l<ls.l;
}
};
set<Node_t>chtholly;
inline auto split(int x) {
if(x>n) return chtholly.end();
auto it=--chtholly.upper_bound(Node_t(x,0,0));
if(it->l==x) return it;
int l=it->l,r=it->r,v=it->v;
chtholly.erase(it);
chtholly.insert(Node_t(l,x-1,v));
return chtholly.insert(Node_t(x,r,v)).first;
}
inline void assign(int l,int r,int v) {
auto itr=split(r+1),itl=split(l);
chtholly.erase(itl,itr);
chtholly.insert(Node_t(l,r,v));
}
inline int check(int l,int r,int d) {
int res=0;auto itr=split(r+1),itl=split(l);
for(register auto it=itl;it!=itr;it++) res+=(it->v==d)*(it->r-it->l+1);
auto k=itl;
while(k->v==itl->v) {
l=k->l;
if(k->l==1) break;
k--;
}
k=itl;
while(k->v==itl->v) {
r=k->r;
if(k->r==n) break;
k++;
}
assign(l,r,itl->v);
return res;
}
struct nd {
int value,cnt;
inline nd(const int&va,const int&cn) : value(va),cnt(cn) {}
inline bool operator<(const nd&ls) const {
return value<ls.value;
}
};
inline void sot(int l,int r) {
vector<nd>vec;auto itr=split(r+1),itl=split(l);
for(register auto it=itl;it!=itr;it++) vec.push_back(nd(it->v,it->r-it->l+1));
chtholly.erase(itl,itr);
sort(vec.begin(),vec.end());int ll=l,lv=vec[0].value,len=vec[0].cnt;
for(register int i=1;i<vec.size();i++) {
if(vec[i].value!=lv) {
chtholly.insert(Node_t(ll,ll+len-1,lv));ll+=len;lv=vec[i].value;len=vec[i].cnt;
}else len+=vec[i].cnt;
}
chtholly.insert(Node_t(ll,ll+len-1,lv));
auto it=chtholly.lower_bound(Node_t(l,0,0));
auto k=it;
while(k->v==it->v) {
l=k->l;
if(k->l==1) break;
k--;
}
assign(l,it->r,it->v);
k=it=chtholly.lower_bound(Node_t(ll,0,0));
while(k->v==it->v) {
r=k->r;
if(k->r==n) break;
k++;
}
assign(it->l,r,it->v);
return ;
}
int main() {
int ls=1;char lw;
cin>>lw;if(lw>='a') lw-='a'-'A';
for(int i=2;i<=n;i++) {
char k;
cin>>k;if(k>='a') k-='a'-'A';
if(k!=lw) chtholly.insert(Node_t(ls,i-1,lw-'A')),lw=k,ls=i;
}
chtholly.insert(Node_t(ls,n,lw-'A'));
while(m--) {
int opt=read(),l=read(),r=read();
if(opt==1) {
char k;cin>>k;if(k>='a') k-='a'-'A';
print(check(l,r,k-'A'),'\n');
}else if(opt==2) {
char k;cin>>k;if(k>='a') k-='a'-'A';
assign(l,r,k-'A');
auto it=chtholly.lower_bound(Node_t(l,0,0));
auto ti=it;
while(ti->v==it->v) {
l=ti->l;
if(ti->l==1) break;
ti--;
}
ti=it;
while(ti->v==it->v) {
r=ti->r;
if(ti->r==n) break;
ti++;
}
assign(l,r,k-'A');
}else sot(l,r);
}
return 0;
}