HDU 6345(子串查询 暴力)

Wesley13
• 阅读 612

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

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

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

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

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

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

HDU 6345(子串查询 暴力) HDU 6345(子串查询 暴力)

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <queue>
 6 #include <stack>
 7 #include <cmath>
 8 #include <map>
 9 using namespace std;
10 int num[100006];
11 char alp[100006];
12 int main()
13 {
14     std::ios::sync_with_stdio(false);
15     int t,len,m,l,r;
16     string s;
17     cin >> t;
18     for(int i = 1; i <= t; i++)
19     {
20         memset(num,0,sizeof(num));
21         cin >> len >> m;
22         cin >> s;
23         cout << "Case #"<< i <<":" << endl;
24         num[0] = 1;
25         alp[0] = s[0];
26         for(int i = 1; i < len; i++)
27         {
28             if(s[i]<alp[i-1])
29             {
30                 alp[i] = s[i];
31                 num[i] = 1;
32             }
33             else if(s[i] == alp[i-1])
34             {
35                 alp[i] = s[i];
36                 num[i] = num[i-1]+1;
37             }
38             else
39             {
40                 alp[i] = alp[i-1];
41                 num[i] = num[i-1];
42             }
43         }
44         while(m--)
45         {
46             cin >> l >> r;
47             l--;
48             r--;
49             if(l==r)
50             {
51                 cout << 1 << endl;
52                 continue;
53             }
54             if(alp[r] < alp[l])
55                 cout << num[r] << endl;
56             else if(alp[r] == alp[l])
57             {
58                 if(alp[l] < s[l] && alp[r] < s[r])
59 //      bug在此: ACBBB...BBCA 查中间,前面白算
60 
61                 if(alp[l]==s[l])
62                     cout << num[r]-num[l]+1 << endl;
63                 else
64                     cout << num[r]-num[l] << endl;
65             }
66         }
67     }
68     return 0;
69 }

View Code

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

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

HDU 6345(子串查询 暴力) HDU 6345(子串查询 暴力)

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 int rc[100100][26];
 5 int main()
 6 {
 7     std::ios::sync_with_stdio(false);
 8     int n,t,q,l,r,j,i;
 9     cin >> t;
10     string s;
11     for(int i=0;i<26;i++)
12     {
13         rc[0][i]=0;
14     }
15     for(int c=1;c<=t;c++)
16     {
17         cout << "Case #" << c << ":" << endl;
18         cin >> n >> q;
19         cin >> s;
20         for(i=0;s[i];i++)
21         {
22             for(j=0;j<=25;j++)
23             {
24                 rc[i+1][j]=rc[i][j];
25             }
26             rc[i+1][s[i]-'A']++;
27         }
28         for(i=0;i<q;i++)
29         {
30             cin >> l >> r;
31             int ans = 0;
32             for(j = 0;ans==0;j++)
33             {
34                 ans = rc[r][j]-rc[l-1][j];
35             }
36             cout << ans << endl;
37         }
38     }
39     return 0;
40 }

View Code

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
2年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
JS 苹果手机日期显示NaN问题
问题描述newDate("2019122910:30:00")在IOS下显示为NaN原因分析带的日期IOS下存在兼容问题解决方法字符串替换letdateStr"2019122910:30:00";datedateStr.repl
Stella981 Stella981
2年前
JavaScript算法系列之
1.输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba字符串拼接(先理解不输入重复字符的)1functionpermutate(str){2varresult;
Stella981 Stella981
2年前
JavaScript常用函数
1\.字符串长度截取functioncutstr(str,len){vartemp,icount0,patrn/^\x00\xff/,strre"";for(vari
Wesley13 Wesley13
2年前
unity将 -u4E00 这种 编码 转汉字 方法
 unity中直接使用 JsonMapper.ToJson(对象),取到的字符串,里面汉字可能是\\u4E00类似这种其实也不用转,服务器会通过类似fastjson发序列化的方式,将json转对象,获取对象的值就是中文但是有时服务器要求将传参中字符串中类似\\u4E00这种转汉字,就需要下面 publ
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_