没错就是用来造(蹭)福(访)大(问)众(量)的
发现最小的子串只会是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 }
原文地址:https://www.cnblogs.com/ZincSabian/p/9419213.html
时间: 2024-10-19 22:41:04