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

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

开始时盲目暴力,直接用桶排序的做法一段一段去求,果然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. 【CF446C】DZY Loves Fibonacci Numbers (线段树 + 斐波那契数列)

    Description ​ 看题戳我 给你一个序列,要求支持区间加斐波那契数列和区间求和.\(~n \leq 3 \times 10 ^ 5, ~fib_1 = fib_2 = 1~\). Solut ...

  2. Java 类设计技巧

    摘自<Java核心技术>卷I:基础知识 p140 第4章对象与类 - 类设计技巧 1)一定将数据设计为私有. 最重要的是:绝对不要破坏封装性.有时候,需要编写一个访问器方法或更改器方法,但 ...

  3. Android工程图片资源命名禁忌

    Android工程中,res\drawable\ 文件夹下所有的图片资源文件命名,不允许: 1. 大写字母 从Eclipse的这个报错可以知道资源文件的命名规则. Invalid file name: ...

  4. Double.valueOf(0.0D) 分析

    private Double price = Double.valueOf(0.0D); 查看Java API 文档如下: doubleValue public double doubleValue( ...

  5. 【map】p1184 高手之在一起

    题目背景 高手是可以复活的,这点我们大家都知道. 题目描述 高手列出了一个详尽的日程表,这次他要追求的则是一个心灵纯洁的小萝莉.他和她都是要上课的,但是也会有时间空闲,于是高手决定无时无刻都要跟着她. ...

  6. Jarvis OJ [XMAN]level1 write up

    首先 老规矩,把软件拖到Ubuntu里checksec一下文件 然后知道了软件位数就放到IDA32里面... 熟悉的函数名... 缘真的妙不可言... 然后看了下vulnerable_function ...

  7. [luoguU48834][count]

    题目链接 思路 这个题可以考虑用全部情况减去不合法的情况,来求解.首先需要知道n个点所组成的图总共有\(C(_n^2)\)种,然后用f[n]表示n个点的图联通的方案数. 然后钦定1在联通图里面,考虑不 ...

  8. c语言: 修改参数的地址,及注意事项

    如果需要在函数中修改参数的地址,首先参数肯定要是指针类型,同时传递的参数不能直接使用数组变量,至少需要先转换一下. 比如: char str[] = "123"; 不能直接传 ab ...

  9. url加时间戳方法及作用

    速记:URL 的末尾追加了时间.这就确保了请求不会在它第一次被发送后即缓存,而是会在此方法每次被调用后重新创建和重发:此 URL 会由于时间戳的不同而稍微有些不同.这种技巧常被用于确保到脚本的 POS ...

  10. matlab图片 latex显示

    matlab图片另存为bmp格式,用在线网站转换格式为png. 莫要直接另存为jpg格式,在latex中显示,否则图片显示的质量不高.