RT,有四个点 MLE 了。
#include<bits/stdc++.h>
using namespace std;
const int N=6e4+10;
struct node{
int l,r,id,ans;
}q[N];
int a[N],pos[N];
int cnt[(1<<26)+10];
int ans;
bool cmp1(node x,node y){
if(pos[x.l]==pos[y.l]) return x.r<y.r;
return x.l<y.l;
}
bool cmp2(node x,node y){
return x.id<y.id;
}
inline void fake_main(){
int n,m; cin>>n>>m;
int siz=max(1,(int)(n/sqrt(m)));
for(int i=1;i<=n;i++) pos[i]=(i-1)/siz+1;
string s; cin>>s; s=' '+s;
for(int i=1;i<=m;i++){
cin>>q[i].l>>q[i].r;
q[i].l--; q[i].id=i;
}
for(int i=1;i<=n;i++) a[i]=a[i-1]^(1<<(s[i]-'a'));
sort(q+1,q+m+1,cmp1);
int l=1,r=0;
for(int i=1;i<=m;i++){
for(;l<q[i].l;){
for(int j=0;j<26;j++) cnt[a[l]^(1<<j)]--;
cnt[a[l]]--;
ans-=cnt[a[l]];
l++;
}
for(;l>q[i].l;){
l--;
ans+=cnt[a[l]];
for(int j=0;j<26;j++) cnt[a[l]^(1<<j)]++;
cnt[a[l]]++;
}
for(;r<q[i].r;){
r++;
ans+=cnt[a[r]];
for(int j=0;j<26;j++) cnt[a[r]^(1<<j)]++;
cnt[a[r]]++;
}
for(;r>q[i].r;){
for(int j=0;j<26;j++) cnt[a[r]^(1<<j)]--;
cnt[a[r]]--;
ans-=cnt[a[r]];
r--;
}
q[i].ans=ans;
}
sort(q+1,q+m+1,cmp2);
for(int i=1;i<=m;i++) cout<<q[i].ans<<"\n";
}
signed main(){
ios::sync_with_stdio(false);
int t; t=1;
while(t--) fake_main();
}