百度之星2018资格赛1002题解

作为退役的老人家来光顾光顾百度之星。

据说资格赛水过一道题就行。。。就写那个签到题吧。orz

题目糊上,,,

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

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

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

一开始看这个题,MD这么复杂,一看就是dalao出的题。

抓住关键词,字典序最小,首先考虑字符串长度最小,emmmm,当然是一个字母长度最小。

所以这个题就变成了,在一段字符区间中统计最小的那个字母出现了几次。

emmmmm,能把这么水的一个题说的这么高大上,我也是给出题人跪了。。。orz

用个前缀和思想。统计一下到当前位置每个字母出现几次,数组下标1~26表示A~Z出现的次数。

查询的时候从1到26循环若a[r]-a[l-1]不为零,就是他了,输出,跳出循环(这样字典序最小,因为相当于从A向Z找)。

说了这么多我相信都是废话,诸位大佬肯定能A掉这个题。emmmmmm

上代码。(丑得一逼)

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <vector>
 5 #include <queue>
 6 #include <deque>
 7 #include <stack>
 8 #include <string>
 9 #include <cstdlib>
10 #include <cstring>
11 #define LL long long
12 using namespace std;
13 void read(int &x){
14     char ch;x = 0;ch = getchar();
15     while(ch < ‘0‘ || ch > ‘9‘) ch = getchar();
16     while(ch >= ‘0‘ && ch <= ‘9‘){
17         x = x*10+ch-‘0‘;
18         ch = getchar();
19     }
20 }
21 struct H {
22     int qq[26];
23 }cc[100000+5];
24 int T = 0,n,q,l,r,minn,num,cntt;
25 int cnt[‘Z‘+5];
26 char ch[100000+5];
27 int main(){
28     read(T);
29     while(T--){
30         printf("Case #");++cntt;
31         printf("%d:\n",cntt);
32         read(n);read(q);
33         for(int i = 1;i <= n;i++)
34             scanf("%c",&ch[i]);
35         for(int i = 1;i <= n;i++){
36             cc[i] = cc[i-1];
37             cc[i].qq[ch[i]-‘A‘]++;
38         }
39         for(int i = 1;i <= q;i++){
40             read(l);read(r);
41             if(l == r){
42                 printf("1\n");
43                 continue;
44             }
45             else {
46                 for(int j = 0;j < 26;j++){
47                     if(cc[r].qq[j]-cc[l-1].qq[j]!=0){
48                         printf("%d\n",cc[r].qq[j]-cc[l-1].qq[j]);
49                         break;
50                     }
51                 }
52             }
53         }
54     }
55     return 0;
56 }

原文地址:https://www.cnblogs.com/syx-799/p/9420463.html

时间: 2024-10-02 04:57:38

百度之星2018资格赛1002题解的相关文章

百度之星2018资格赛t6三原色图(MST minimum spanning tree)

ac代码: #include<bits/stdc++.h> #define per(i,a,b) for(int i=a;i<=b;i++) using namespace std; typedef long long ll; const int mod=998244353; const int inf =0x3f3f3f3f; const double eps=1e-8; #define siz 110 int n,m,Enum,ans[siz]; struct Edge { int

【百度之星2014~资格赛解题报告】

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<标题>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=666 前言 最近要毕业了,有半年没做比赛了.这次参加百度之星娱乐一下.现在写一下解题报

百度之星2014资格赛 1004 - Labyrinth

先上题目: Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2911    Accepted Submission(s): 1007 Problem Description 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一

百度之星2014初赛 - 1002 - Grids

先上题目: Grids Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 0    Accepted Submission(s): 0 Problem Description 度度熊最近很喜欢玩游戏.这一天他在纸上画了一个2行N列的长方形格子.他想把1到2N这些数依次放进去,但是为了使格子看起来优美,他想找到使每行每列都递增的方案.不过画

百度之星2014资格赛 1003 - Xor Sum

先上代码: Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)Total Submission(s): 7837    Accepted Submission(s): 3350 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus

&lt;百度之星2014资格赛&gt;Disk Schedule 报告

Disk ScheduleTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 780    Accepted Submission(s): 119 Problem Description 有很多从磁盘读取数据的需求,包括顺序读取.随机读取.为了提高效率,需要人为安排磁盘读取.然而,在现实中,这种做法很复杂.我们考虑一个相对简单的场景. 磁盘有

百度之星2014复赛 - 1002 - The Query on the Tree

先上题目: The Query on the Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 54    Accepted Submission(s): 18 Problem Description 度度熊最近沉迷在和树有关的游戏了,他一直认为树是最神奇的数据结构.一天他遇到这样一个问题: 有一棵树,树的每个点有点权,每次有三种

2019 年百度之星 初赛一 1002 Game

传送门 Problem Description 度度熊在玩一个好玩的游戏.游戏的主人公站在一根数轴上,他可以在数轴上任意移动,对于每次移动,他可以选择往左或往右走一格或两格.现在他要依次完成 n 个任务,对于任务 i,只要他处于区间 [ai,bi] 上,就算完成了任务.度度熊想知道,为了完成所有的任务,最少需要移动多少次?度度熊可以任意选择初始位置. Input 第一行一个整数 T (1≤T≤10) 表示数据组数.对于每组数据,第一行一个整数 n (1≤n≤1000) 表示任务数.接下来 n 行

百度之星2018 复赛 体验记

毒瘤卡常啊我勒个去 A 题被卡常我要骂人了 C 题写了一个常数大的做法,被卡到怀疑人生(后来重写才 AC 的mdzz). 还好 B 和 D 比较善良 题解不想写了 直接放代码QAQ #include <bits/stdc++.h> using namespace std; typedef long long LL; const int N=100005; LL read(){ LL x=0,f=1; char ch=getchar(); while (!isdigit(ch)&&