题意:
给一个长度为n的字符串,q组询问
每组询问给区间[l,r],问区间内字典序最小的子串出现的次数是多少
思路:
区间内字典序最小的子串,其实就是区间内最小的单个字母
所以题目其实是求区间内最小字母的个数
因为不涉及修改,所以线段树维护区间最小值以及最小值的数量可解
但是更简单的做法是求出26个字母的前缀和
对于每个询问,从小到大查询区间内每个字母的数量,第一个不为0的数量就是答案
code:
#include<bits/stdc++.h>
using namespace std;
const int maxm=1e5+5;
int sum[maxm][26];
char s[maxm];
signed main(){
int T;
scanf("%d",&T);
int cas=1;
while(T--){
printf("Case #%d:\n",cas++);
int n,q;
scanf("%d%d",&n,&q);
scanf("%s",s+1);
for(int i=1;i<=n;i++){
for(int j=0;j<26;j++){
sum[i][j]=sum[i-1][j];
}
sum[i][s[i]-'A']++;
}
while(q--){
int l,r;
scanf("%d%d",&l,&r);
int ans=0;
for(int i=0;i<26;i++){
if(sum[r][i]-sum[l-1][i]!=0){
ans=sum[r][i]-sum[l-1][i];
break;
}
}
printf("%d\n",ans);
}
}
return 0;
}