题目

度度熊的字符串课堂开始了!要以像度度熊一样的天才为目标,努力奋斗哦!

为了检验你是否具备不听课的资质,度度熊准备了一个只包含大写英文字母的字符串 A[1,n]=a1a2⋯anA[1,n] = a_1 a_2 \cdots a_nA[1,n]=a​1​​a​2​​⋯a​n​​,接下来他会向你提出 qqq 个问题 (l,r)(l,r)(l,r),你需要回答字符串 A[l,r]=alal+1⋯arA[l,r] = a_l a_{l+1} \cdots a_rA[l,r]=a​l​​a​l+1​​⋯a​r​​ 内有多少个非空子串是 A[l,r]A[l,r]A[l,r] 的所有非空子串中字典序最小的。这里的非空子串是字符串中由至少一个位置连续的字符组成的子序列,两个子串是不同的当且仅当这两个子串内容不完全相同或者出现在不同的位置。

记 ∣S∣|S|∣S∣ 为字符串 SSS 的长度,对于两个字符串 SSS 和 TTT ,定义 SSS 的字典序比 TTT 小,当且仅当存在非负整数 k(≤min(∣S∣,∣T∣))k(\leq \min(|S|,|T|))k(≤min(∣S∣,∣T∣)) 使得 SSS 的前 kkk 个字符与 TTT 的前 kkk 个字符对应相同,并且要么满足 ∣S∣=k|S| = k∣S∣=k 且 ∣T∣>k|T| > k∣T∣>k,要么满足 k<min(∣S∣,∣T∣)k < \min(|S|,|T|)k<min(∣S∣,∣T∣) 且 SSS 的第 k+1k+1k+1 个字符比 TTT 的第 k+1k+1k+1 个字符小。例如 "AA" 的字典序比 "AAA" 小,"AB" 的字典序比 "BA" 小。

分析

对于每个查询题目说是求最小字串的数量,其实就是求这个区间内最小的字母出现的数目。然后就随便搞一下就可以了。

我是直接建了个线段树,可以查询区间最小值,因为只包含大写字母,所以我也记录一下每个区间每个字母出现的次数。对于每个查询,先找出这个区间最小的字母是哪个,然后查询它出现的次数就可以了。

rmq啥的应该也可以搞这个题。

ac代码

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <iostream>
 5
 6 using namespace std;
 7 const int maxn=100000+100;
 8 const int INF=2147400000;
 9 int T,n,q;
10 char s[maxn];
11 int minv[4*maxn],sumv[4*maxn][27];
12 void maintain(int o,int L,int R){
13     minv[o]=min(minv[2*o],minv[2*o+1]);
14     for(int i=0;i<26;i++)
15         sumv[o][i]=sumv[2*o][i]+sumv[2*o+1][i];
16 }
17 void build(int o,int L,int R){
18     if(L==R){
19         minv[o]=s[L]-'A';
20         sumv[o][s[L]-'A']=1;
21         return;
22     }
23     int M=L+(R-L)/2;
24     build(2*o,L,M);
25     build(2*o+1,M+1,R);
26     maintain(o,L,R);
27 }
28 int ql,qr;
29 int q_min(int o,int L,int R){
30     if(ql<=L&&qr>=R)
31         return minv[o];
32     int M=L+(R-L)/2;
33     int ml=INF,mr=INF;
34     if(ql<=M)
35         ml=q_min(2*o,L,M);
36     if(qr>M)
37         mr=q_min(2*o+1,M+1,R);
38     return min(ml,mr);
39 }
40 int v;
41 int q_sum(int o,int L,int R){
42     if(ql<=L&&qr>=R){
43         return sumv[o][v];
44     }
45     int res=0;
46     int M=L+(R-L)/2;
47     if(ql<=M)
48         res+=q_sum(2*o,L,M);
49     if(qr>M)
50         res+=q_sum(2*o+1,M+1,R);
51     return res;
52 }
53 int main(){
54     scanf("%d",&T);
55     for(int t=1;t<=T;t++){
56         printf("Case #%d:\n",t);
57         scanf("%d%d",&n,&q);
58         scanf("%s",s+1);
59         memset(sumv,0,sizeof(sumv));
60         build(1,1,n);
61         for(int i=1;i<=q;i++){
62             scanf("%d%d",&ql,&qr);
63             v=q_min(1,1,n);
64             printf("%d\n",q_sum(1,1,n));
65         }
66     }
67 return 0;
68 }
69 //CODE FROM LQLlulu

View Code

转载于:https://www.cnblogs.com/LQLlulu/p/9418674.html

【2018百度之星资格赛】1002 子串查询相关推荐

  1. 字符串处理 百度之星资格赛 1002 列变位法解密

    题目传送门 1 /* 2 字符串处理:要求解码,然而二维数组开不下,可以直接输出 3 只要在余数的地方判断一下就行了,vector的效率不高 4 */ 5 #include <cstdio> ...

  2. 字符串处理 2015百度之星资格赛 1002 列变位法解密

    题目传送门 1 /* 2 字符串处理:要求解码,然而二维数组开不下,可以直接输出 3 只要在余数的地方判断一下就行了,vector的效率不高 4 另外:感觉麻烦的地方应该纸上写写就清楚了 5 */ 6 ...

  3. 2018百度之星程序设计大赛 - 资格赛 1002 子串查询

    子串查询 Accepts: 1262 Submissions: 5335 Time Limit: 3500/3000 MS (Java/Others) Memory Limit: 262144/262 ...

  4. 2018百度之星资格赛:1002:子串查询

    子串查询  Submissions: 12650  Time Limit: 3500/3000 MS (Java/Others)  Memory Limit: 262144/262144 K (Jav ...

  5. 2015百度之星资格赛1002

    </pre><p></p><p></p>题目名称:列变位法解密 <p>题目链接:http://bestcoder.hdu.edu ...

  6. HDU - 6344 2018百度之星资格赛 1001调查问卷(状压dp)

    调查问卷  Accepts: 1289  Submissions: 5642  Time Limit: 6500/6000 MS (Java/Others)  Memory Limit: 262144 ...

  7. ACM学习历程—BestCoder 2015百度之星资格赛1002 列变位法解密(vector容器)

    Problem Description 列变位法是古典密码算法中变位加密的一种方法,具体过程如下 将明文字符分割成个数固定的分组(如5个一组,5即为密钥),按一组一行的次序整齐排列,最后不足一组不放置 ...

  8. 2018百度之星程序设计大赛 - 资格赛 hdu6345(找区间最小值)

    子串查询 Time Limit: 3500/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Sub ...

  9. 2014年百度之星资格赛第一题Energy Conversion

    2014年百度之星资格赛第一题Energy Conversion Problem Description 魔法师百小度也有遇到难题的时候-- 如今,百小度正在一个古老的石门面前,石门上有一段古老的魔法 ...

最新文章

  1. java 数据结构 无向图_数据结构-无向图
  2. Hive学习笔记,你想知道的Hive
  3. Flutter入门:设置全局字体
  4. docker下如何进入到容器中
  5. 斯坦福NLP组最新报告:自然语言处理中的学习挑战(附149页报告全文下载
  6. 吴恩达深度学习 ——深层神经网络(选择题)
  7. 在jsp页面下, 让eclipse完全支持HTML/JS/CSS智能提示
  8. PeekMessage抓取消息,如何把每个消息都获取到呢?
  9. debian、ubuntu安装metasploit通用方法
  10. asp获取计算机mac,ASP获取客户端MAC地址(源代码)
  11. HDU.2111 Saving HDU(贪心)
  12. 网络安全实效性衡量指南:如何作出准确评估
  13. python入门教程傻瓜版_大数据学习资料集--2014-12-23
  14. Python实现pdf转word
  15. 小白学 Python 数据分析(8):Pandas 数据透视表(pivot_table)
  16. PM_09 十大管理之项目人力资源管理(六)
  17. 给ibus-rime输入法添加小鹤双拼方案
  18. Win7定时任务——提醒自己喝水
  19. lua入门之环境搭建、第一个demo
  20. 推理日本谋杀案的问题

热门文章

  1. leetcode378 Kth Smallest Element in a Sorted Matrix
  2. Java中如何判断一个字符串是否为数字
  3. hdu 6096 String
  4. Spring mvc+ maven + MyBatis + Oracle + IDEA 项目搭建 - framework 进阶中(一)
  5. 2012最新75款好看的英文字体免费下载【中篇】
  6. k8s访问控制--理解RBAC和OPA
  7. spark基础之Spark SQL和Hive的集成以及ThriftServer配置
  8. (47)FPGA同步复位与异步复位(异步复位同步释放)
  9. (32)Verilog HDL按位运算
  10. FPGA转正总结(标准版)