hdu 6345 子串查询
度度熊的字符串课堂开始了!要以像度度熊一样的天才为目标,努力奋斗哦!
为了检验你是否具备不听课的资质,度度熊准备了一个只包含大写英文字母的字符串 A[1,n]=a1a2...an
接下来他会向你提出 q 个问题 (l,r),你需要回答字符串 A[l,r]=alal+1...ar 内有多少个非空子串是 A[l,r] 的所有非空子串中字典序最小的。
这里的非空子串是字符串中由至少一个位置连续的字符组成的子序列,两个子串是不同的当且仅当这两个子串内容不完全相同或者出现在不同的位置。
问区间内出现的最小字符的出现次数,前缀和一波就行了
1 #include "bits/stdc++.h" 2 using namespace std; 3 const int N = 1e5 + 10; 4 int n, q, cnt[N][30]; 5 char s[N]; 6 void sol() { 7 scanf("%d%d%s", &n, &q, s + 1); 8 for(int i = 1 ; i <= n ; ++ i) { 9 for(int j = 0 ; j < 26 ; ++ j) { 10 cnt[i][j] = cnt[i - 1][j]; 11 } 12 ++ cnt[i][s[i] - 'A']; 13 } 14 for(int i = 1, l, r ; i <= q ; ++ i) { 15 scanf("%d%d", &l, &r); 16 for(int j = 0 ; j < 26 ; ++ j) if(cnt[r][j] - cnt[l - 1][j]) { printf("%d\n", cnt[r][j] - cnt[l - 1][j]); break; } 17 } 18 } 19 int main() { 20 int T; scanf("%d", &T); 21 for(int i = 1 ; i <= T ; ++ i) { 22 printf("Case #%d:\n", i); 23 sol(); 24 } 25 }