[C++] 纯文本查看 复制代码 #include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int>PII;
void solve(){
int n,k,q;
cin>>n>>k>>q;
string str;
cin>>str;
str=" "+str;
int lim=sqrt(n),idx=0,res=0;
vector<array<int,4>>que(q+10);
vector<int>mmap(n+10),ans(q+10),cnt(n+10);
map<vector<int>,int>mp;
vector pre(n+10,vector<int>(26));
for(int i=1;i<=n;i++){
for(int j=0;j<=25;j++){
if(j==str[i]-'a'){
pre[i][j]=(pre[i-1][j]+1)%k;
}else pre[i][j]=pre[i-1][j];
}
}
for(int i=0;i<=n;i++){
if(!mp.count(pre[i])){
mp[pre[i]]=idx++;
}
mmap[i]=mp[pre[i]];
}
for(int i=1;i<=q;i++){
int x,y;
cin>>x>>y;
que[i]=array<int,4>{x-1,y,i,(x-1)/lim};
}
sort(que.begin()+1,que.begin()+1+q,[](array<int,4>&a,array<int,4>&b){
if(a[3]!=b[3])return a[3]<b[3];
return a[1]<b[1];
});
auto add=[&](int x){
int &t=cnt[mmap[x]];
res=res+t;
t++;
};
auto del=[&](int x){
int &t=cnt[mmap[x]];
res=res-(t-1);
t--;
};
for(int i=1,l=1,r=0;i<=q;i++){
int l2=que[i][0],r2=que[i][1];
while(r<r2)add(++r);
while(r>r2)del(r--);
while(l<l2)del(l++);
while(l>l2)add(--l);
ans[que[i][2]]=res;
}
for(int i=1;i<=q;i++)cout<<ans[i]<<endl;
}
signed main(){
int t=1;ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
// cin>>t;
while(t--)solve();
return 0;
}
|