2018百度之星资格赛1002

没错就是用来造(蹭)福(访)大(问)众(量)的

发现最小的子串只会是A~Z

直接统计前缀和...sum[26]统计一下。。。

 1 #include<cstdio>
 2 #include<cstring>
 3 int sum[100005][26];
 4 int main() {
 5     int t;
 6     scanf("%d",&t);
 7     for(int T=1;T<=t;T++) {
 8         printf("Case #%d:\n",T);
 9         memset(sum,0,sizeof(sum));
10         int n,q;
11         char s[100005];
12         scanf("%d%d",&n,&q);
13         scanf("%s",s+1);
14         for(int i=1;i<=n;i++) {
15             for(int j=0;j<26;j++)
16                 if((s[i]-'A')==j) sum[i][j]=sum[i-1][j]+1;
17                 else sum[i][j]=sum[i-1][j];
18         }
19         while(q--) {
20             int l,r,ans=0;
21             scanf("%d%d",&l,&r);
22             for(int j=0;j<26;j++)
23                 if((sum[r][j]-sum[l-1][j])>0) {
24                     ans=sum[r][j]-sum[l-1][j];
25                     break;
26                 }
27             printf("%d\n",ans);
28         }
29     }
30 }
View Code

猜你喜欢

转载自www.cnblogs.com/ZincSabian/p/9419213.html