HDU 6345(子串查询 暴力)
题意是每组给定一个字符串,在有限查询次数内输出所要查询区间的字典序最小的子串个数。
字典序最小的子串,就是所查询区间中字典序最小的单个字符,问题就转化成了求一段区间内字典序最小的字符个数。
开始时盲目暴力,直接用桶排序的做法一段一段去求,果然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(子串查询 暴力)的更多相关文章
- HDU 6345:子串查询(前缀和)
子串查询 Time Limit: 3500/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Sub ...
- 子串查询(二维前缀数组) 2018"百度之星"程序设计大赛 - 资格赛
子串查询 Time Limit: 3500/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Subm ...
- 百度之星资格赛2018B题-子串查询
子串查询 题目 度度熊的字符串课堂开始了!要以像度度熊一样的天才为目标,努力奋斗哦! 为了检验你是否具备不听课的资质,度度熊准备了一个只包含大写英文字母的字符串 A[1,n]=a1a2⋯an,接下来他 ...
- HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) Total Sub ...
- hdu 4288 线段树 暴力 **
题意: 维护一个有序数列{An},有三种操作: 1.添加一个元素. 2.删除一个元素. 3.求数列中下标%5 = 3的值的和. 解题思路: 看的各种题解,今天终于弄懂了. 由于线段树中不支持添加.删除 ...
- hdu 5461 Largest Point 暴力
Largest Point Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...
- HDU 5908 Abelian Period 暴力
Abelian Period 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5908 Description Let S be a number st ...
- hdu 5762 Teacher Bo 暴力
Teacher Bo 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5762 Description Teacher BoBo is a geogra ...
- HDU 1333 基础数论 暴力
定义一种数位simth数,该数的各位之和等于其所有质因子所有位数字之和,现给出n求大于n的最小该种数,n最大不超过8位,那么直接暴力就可以了. /** @Date : 2017-09-08 14:12 ...
随机推荐
- MT【306】圆与椭圆公切线段
已知椭圆方程$\dfrac{x^2}{4}+\dfrac{y^2}{3}=1$,圆方程$x^2+y^2=r^2,(3<r^2<4)$,若直线$l$与椭圆和圆分别切于点$P,Q$求$|PQ| ...
- Centos Install Keepalived
Keepalived简介Keepalived 的作用是检测 web 服务器的状态,如果有一台 web 服务器死机,或工作出现故障,Keepalived 将检测到,并将有故障的 web 服务器从系统中剔 ...
- bzoj4671: 异或图
bzoj4671: 异或图 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 ( ...
- 搜索引擎(Elasticsearch搜索详解)
学完本课题,你应达成如下目标: 掌握ES搜索API的规则.用法. 掌握各种查询用法 搜索API 搜索API 端点地址 GET /twitter/_search?q=user:kimchy GET /t ...
- CISCO运维记录之3650堆叠设备升级IOS(Version 16.3.6版本存在bug)
CISCO运维记录之3650堆叠设备升级IOS(Version 16.3.6版本存在bug) 思科3000系列交换机使用cat3k_caa-universalk9.16.3.6版本存在bug,设备运行 ...
- [2017-7-26]Android Learning Day4
RecycleView 恩,学习Fragment的过程中的一个小实践居然用到了RecycleView!坑了我好久有木有!!好气哦,从昨晚到现在.(现在也还是一头雾水,不过照搬也会用了) 这是第一版的代 ...
- 「ZJOI2016」旅行者 解题报告
「ZJOI2016」旅行者 对网格图进行分治. 每次从中间选一列,然后枚举每个这一列的格子作为起点跑最短路,进入子矩形时把询问划分一下,有点类似整体二分 至于复杂度么,我不会阿 Code: #incl ...
- NOI2018d1t1 归程 (dijkstra+kruskal重构树)
题意:给一张无向联通图,每条边有长度和高度,每次询问在高度大于p的边,从v点能到达的所有点到1号点的最短距离(强制在线) 首先dijkstra求出每个点到1号点的距离 易知:如果我按高度从高到低给边排 ...
- Python中的实例方法、classmethod和staticmethod的区别
class NewsPaper(object): # 类属性 __print_times = 0 # 下划线表示私有属性 # 实例方法 def __init__(self, title, conten ...
- Windows cmd命令
运行操作 CMD命令锦集 1. gpedit.msc-----组策略 2. sndrec32-------录音机 3. Nslookup-------IP地址侦测器 ,是一个监测网络中DN ...