题意是每组给定一个字符串,在有限查询次数内输出所要查询区间的字典序最小的子串个数。

字典序最小的子串,就是所查询区间中字典序最小的单个字符,问题就转化成了求一段区间内字典序最小的字符个数。

开始时盲目暴力,直接用桶排序的做法一段一段去求,果然t了(这种就不贴代码了)......

然后想到先扫一遍,求出从字符串首位到第 i 位的最小字符数,再用一个数组存第 0 位到第 i 位的最小字符,比较第 i 位的字符和前 i - 1 位的最小字符,第 i 位更小的话就更新最小字符和最小字符数......这样扫一遍后,问到哪个区间就比较区间左右端点的最小字符。若左侧较大,则直接输出右侧最小字符数;若两侧相等,则输出右侧的最小字符数减去左侧的最小字符数;左侧不可能小于右侧。

但是,这种想法有较大漏洞,不能说漏洞,这就是错误的想法,因为这样所记录的最小的字符未必会出现在所求区间内......

作为对自己的警示,把这种错误的东西挂出来侮辱下自己......

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
using namespace std;
int num[];
char alp[];
int main()
{
std::ios::sync_with_stdio(false);
int t,len,m,l,r;
string s;
cin >> t;
for(int i = ; i <= t; i++)
{
memset(num,,sizeof(num));
cin >> len >> m;
cin >> s;
cout << "Case #"<< i <<":" << endl;
num[] = ;
alp[] = s[];
for(int i = ; i < len; i++)
{
if(s[i]<alp[i-])
{
alp[i] = s[i];
num[i] = ;
}
else if(s[i] == alp[i-])
{
alp[i] = s[i];
num[i] = num[i-]+;
}
else
{
alp[i] = alp[i-];
num[i] = num[i-];
}
}
while(m--)
{
cin >> l >> r;
l--;
r--;
if(l==r)
{
cout << << endl;
continue;
}
if(alp[r] < alp[l])
cout << num[r] << endl;
else if(alp[r] == alp[l])
{
if(alp[l] < s[l] && alp[r] < s[r])
// bug在此: ACBBB...BBCA 查中间,前面白算 if(alp[l]==s[l])
cout << num[r]-num[l]+ << endl;
else
cout << num[r]-num[l] << endl;
}
}
}
return ;
}

接着又想到可否将最小字符出现的位置记录下来,然后发现完全是在自己哄自己开心......

借助wjy的力量,用二维数组记录位置的似桶排序的做法完成了题目,路还很长......

 #include <iostream>
#include <cstring>
using namespace std;
int rc[][];
int main()
{
std::ios::sync_with_stdio(false);
int n,t,q,l,r,j,i;
cin >> t;
string s;
for(int i=;i<;i++)
{
rc[][i]=;
}
for(int c=;c<=t;c++)
{
cout << "Case #" << c << ":" << endl;
cin >> n >> q;
cin >> s;
for(i=;s[i];i++)
{
for(j=;j<=;j++)
{
rc[i+][j]=rc[i][j];
}
rc[i+][s[i]-'A']++;
}
for(i=;i<q;i++)
{
cin >> l >> r;
int ans = ;
for(j = ;ans==;j++)
{
ans = rc[r][j]-rc[l-][j];
}
cout << ans << endl;
}
}
return ;
}

HDU 6345(子串查询 暴力)的更多相关文章

  1. HDU 6345:子串查询(前缀和)

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

  2. 子串查询(二维前缀数组) 2018"百度之星"程序设计大赛 - 资格赛

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

  3. 百度之星资格赛2018B题-子串查询

    子串查询 题目 度度熊的字符串课堂开始了!要以像度度熊一样的天才为目标,努力奋斗哦! 为了检验你是否具备不听课的资质,度度熊准备了一个只包含大写英文字母的字符串 A[1,n]=a1a2⋯an,接下来他 ...

  4. HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Sub ...

  5. hdu 4288 线段树 暴力 **

    题意: 维护一个有序数列{An},有三种操作: 1.添加一个元素. 2.删除一个元素. 3.求数列中下标%5 = 3的值的和. 解题思路: 看的各种题解,今天终于弄懂了. 由于线段树中不支持添加.删除 ...

  6. hdu 5461 Largest Point 暴力

    Largest Point Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...

  7. HDU 5908 Abelian Period 暴力

    Abelian Period 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5908 Description Let S be a number st ...

  8. hdu 5762 Teacher Bo 暴力

    Teacher Bo 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5762 Description Teacher BoBo is a geogra ...

  9. HDU 1333 基础数论 暴力

    定义一种数位simth数,该数的各位之和等于其所有质因子所有位数字之和,现给出n求大于n的最小该种数,n最大不超过8位,那么直接暴力就可以了. /** @Date : 2017-09-08 14:12 ...

随机推荐

  1. MT【307】周期数列

    (2017浙江省数学竞赛) 设数列$\{a_n\}$满足:$|a_{n+1}-2a_n|=2,|a_n|\le2,n\in N^+$证明:如果$a_1$为有理数,则从某项后$\{a_n\}$为周期数列 ...

  2. <Android基础>(二) Activity Part 1

    1.活动的基本用法: 1) 手动创建活动.创建加载布局 2) 在AndroidManifest文件中注册 3) 在活动中添加Button.Toast.Menu 4) 销毁活动 2.Intent 1) ...

  3. ACM-ICPC 2018 南京赛区网络预赛 J题Sum(线性筛素数)

    题目链接:https://nanti.jisuanke.com/t/30999 参考自博客:https://kuangbin.github.io/2018/09/01/2018-ACM-ICPC-Na ...

  4. 用foobar进行码率转换 适用与sacd-r转成低码率

    之前下载了不少高清音频,有黑胶转录的也有母带文件.这些高清音频大都是24bit,采样率96khz或者88.2khz或者更高.而我想将部分精品专辑刻录成cd.首先我需要将这些文件转换为16bit,44. ...

  5. Electron一学习资源收集和练习demo

    1.近日为了做项目查资料学习electron,简直头都要炸了,就官方的electron-quick-start的例子进行了基本的练习之后,不断的查资料终于发现一些有用的demo来看源代码学习,一遍看代 ...

  6. 洛谷P4175 网络管理

    题意:链上带修第k大. 这毒瘤题...别看题意只有7个字,能把我吊打死... 介绍其中两种做法好了.其实思想上是一样的. 对于每一个点,建立权值线段树,维护它到根路径上的所有权值. 一条路径上的点集就 ...

  7. [luogu3939][数颜色]

    题目链接 思路 对于每一种颜色都建立一个动态开点线段树.然后每次查询的时候就去这个颜色的线段树上查询就行了.修改之后不要忘记交换颜色. 这个题目数据有点强.抄了个比较快的读入优化才卡过去. 代码 /* ...

  8. Linux由浅入深学习 (转)

    转自 => 作者:Vamei 出处:http://www.cnblogs.com/vamei 走进Linux 我从这一部分开始走入Linux.Raspbian是Linux的一个发行版本,而Lin ...

  9. 斯坦福大学公开课机器学习:advice for applying machine learning - deciding what to try next(设计机器学习系统时,怎样确定最适合、最正确的方法)

    假如我们在开发一个机器学习系统,想试着改进一个机器学习系统的性能,我们应该如何决定接下来应该选择哪条道路? 为了解释这一问题,以预测房价的学习例子.假如我们已经得到学习参数以后,要将我们的假设函数放到 ...

  10. JDBC的简单笔记

    JDBC笔记: JDBC:java database connectivity SUN公司提供的一套操作数据库的标准规范. JDBC与数据库驱动的关系:接口与实现的关系. JDBC规范(掌握四个核心对 ...