贴个代码(马蜂尚且ok(吧))
#include<iostream>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;
struct intt
{
int l,r;
mutable char type;
bool operator < (const intt &b) const
{
return l<b.l;
}
intt(int L,int R=0,char Type=' ')
{
l=L;
r=R;
type=Type;
}
};
set<intt > odt;
int n,m;
auto split(int ops)
{
auto it=odt.lower_bound(intt(ops));
if(it->l==ops)
return it;
it--;
int L=it->l,R=it->r;
char T=it->type;
odt.erase(it);
odt.insert(intt(L,ops-1,T));
return odt.insert(intt(ops,R,T)).first;
}
void assign(int l,int r,char k)
{
auto itr=split(r+1),itl=split(l);
odt.erase(itl,itr);
odt.insert(intt(l,r,k));
}
void sort_(int l,int r)
{
vector<pair<char,int> > v;
auto itr=split(r+1),itl=split(l);
for(auto it=itl;it!=itr;it++)
v.push_back(make_pair(it->type,(it->r - it->l +1)));
sort(v.begin(),v.end());
odt.erase(itl,itr);
int k=0;
for(int i=l;i<=r;i++)
{
odt.insert(intt(i,i+v[k].second-1,v[k].first));
i=i+v[k].second-1;
k++;
}
}
int query(int l,int r,char k)
{
int sum=0;
auto itr=split(r+1),itl=split(l);
for(auto it=itl;it!=itr;it++)
if(it->type==k)
sum+=it->r - it->l +1;
return sum;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
char k;
cin>>k;
if(k>='a'&&k<='z')
k-=32;
odt.insert(intt(i,i,k));
}
odt.insert(intt(n+1,n+1,' '));
for(int i=1;i<=m;i++)
{
int op,x,y;
char k;
cin>>op>>x>>y;
if(op==1)
{
cin>>k;
if(k>='a'&&k<='z')
k-=32;
cout<<query(x,y,k)<<"\n";
}
if(op==2)
{
cin>>k;
if(k>='a'&&k<='z')
k-=32;
assign(x,y,k);
}
if(op==3)
sort_(x,y);
}
}