题目链接

给定一个长度小于1e5的字符串s,s中字符全是大写英语字母。现在要寻找s中有多少组邻近的“hio”字符串,邻近的定义如下:hi距离+io距离+ho距离小于k。输入k和s,求有多少组邻近的hio。

此题关键在于字符串是一维的序列,hi距离+io距离+ho距离必然是偶数,此距离必为hio中最左端字符和最右端字符距离的二倍。

由此,对于任意最左端字符,只需要保证最右端字符和最左端距离不超过k/2即可。使用二分查找解决。

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.Scanner;
  4. public class Main {
  5. int upperBound(List<Integer> a, int x) {
  6. int l = 0, r = a.size();
  7. while (l + 1 < r) {
  8. int mid = (l + r) >> 1;
  9. if (a.get(mid) <= x) {
  10. l = mid;
  11. } else if (a.get(mid) > x) {
  12. r = mid;
  13. }
  14. }
  15. if (r < a.size() && a.get(r) <= x) r++;
  16. return r;
  17. }
  18. int lowerBound(List<Integer> a, int x) {
  19. int l = 0, r = a.size();
  20. while (l + 1 < r) {
  21. int mid = (l + r) >> 1;
  22. if (a.get(mid) < x) {
  23. l = mid;
  24. } else if (a.get(mid) >= x) {
  25. r = mid;
  26. }
  27. }
  28. if (a.get(l) >= x) l--;
  29. return l;
  30. }
  31. long query(List<Integer> a, int beg, int end) {
  32. int b = lowerBound(a, beg), e = upperBound(a, end);
  33. return e - b - 1;
  34. }
  35. Main() {
  36. Scanner cin = new Scanner(System.in);
  37. int k = cin.nextInt();
  38. char[] a = cin.next().trim().toLowerCase().toCharArray();
  39. List<Integer> h = new ArrayList<>(a.length), i = new ArrayList<>(a.length), o = new ArrayList<>(a.length);
  40. List<Integer> hio = new ArrayList<>(a.length);
  41. for (int j = 0; j < a.length; j++) {
  42. if (a[j] == 'h') {
  43. h.add(j);
  44. hio.add(j);
  45. } else if (a[j] == 'i') {
  46. i.add(j);
  47. hio.add(j);
  48. } else if (a[j] == 'o') {
  49. o.add(j);
  50. hio.add(j);
  51. }
  52. }
  53. k /= 2;
  54. long s = 0;
  55. for (int j : hio) {
  56. if (a[j] == 'h') {
  57. s += query(i, j, j + k) * query(o, j, j + k);
  58. } else if (a[j] == 'i') {
  59. s += query(h, j, j + k) * query(o, j, j + k);
  60. } else if (a[j] == 'o') {
  61. s += query(h, j, j + k) * query(i, j, j + k);
  62. }
  63. }
  64. System.out.println(s);
  65. }
  66. public static void main(String[] args) {
  67. new Main();
  68. }
  69. }

hihocoder编程练习赛91:相邻字符串的更多相关文章

  1. hihocoder编程练习赛52-1 字符串排序

    思路: 将字符串按照新的顺序映射之后再排序. 实现: #include <bits/stdc++.h> using namespace std; int main() { int n; s ...

  2. hihoCoder编程练习赛52

    题目1 : 字符串排序 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 一般我们在对字符串排序时,都会按照字典序排序.当字符串只包含小写字母时,相当于按字母表" ...

  3. hihocoder 编程练习赛23

    第一题:H国的身份证号码I 题意:一个N位的正整数(首位不能是0).每位数字都小于等于K,并且任意相邻两位数字的乘积也小于等于K.按从小到大的顺序输出所有合法的N位号码,每个号码占一行. 思路:dfs ...

  4. hihoCoder编程练习赛72

    题目1 : 玩具设计师 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho作为Z国知名玩具品牌AKIRE的首席设计师,对玩具零件的挑剔程度已经到了叹为观止的地步.所有 ...

  5. hihoCoder编程练习赛69

    题目1 : 偶数长度回文子串 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个小写字母字符串,请判断它是否有长度为偶数的非空连续回文子串 输入 输入包含多组数据. ...

  6. hihocoder编程练习赛75

    题目1 : 工作城市分配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 H公司在北京和上海两个城市各有一间办公室.该公司最近新招募了2N名员工,小Hi负责把这2N名员工 ...

  7. hihoCoder编程练习赛70

    题目1 : 数位翻转 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 n,你可以进行若干次操作,每次操作可以翻转 n 的二进制表示下的某一位,即将 0 变成 ...

  8. hihoCoder编程练习赛67

    题目1 : 序列 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个正整数 n, P,求满足以下两个条件的长度为 n 的序列 ai 个数: 1. 1 ≤ ai ≤ ...

  9. hihoCoder编程练习赛49

    题目1 : 相似颜色 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在CSS中我们可以用井号(#)加6位十六进制数表示一种颜色,例如#000000是黑色,#ff0000 ...

随机推荐

  1. canvas拖拽效果

    canvas拖拽和平时用的js拖拽是有区别的 普通的js是设置目标为绝对定位,再根据鼠标的移动来改变left和top的值 canvas是获得了鼠标的位置,直接在目标点进行重新绘制 下面给一个简单的拖拽 ...

  2. python全栈开发day46-BOM、位置信息、jQurey

    一.昨日内容回顾 1.DOM节点获取:三种方式 2.属性的设置: getAttirbute() setAttribute() .点设置,[]设置 3.节点的创建:   var oDiv = creat ...

  3. Flume+Kafka整合

    脚本生产数据---->flume采集数据----->kafka消费数据------->storm集群处理数据 日志文件使用log4j生成,滚动生成! 当前正在写入的文件在满足一定的数 ...

  4. 7-6 Bandwidth UVA140

    没有清空向量导致debug了好久 这题难以下手  不知道怎么dfs 原来是用排序函数. letter[n]=i; id[i]=n++; 用来储存与设置标记十分巧妙 for(;;) { while(s[ ...

  5. 项目的整体框架,以及Topology的设计

    一:说明 1.项目的整体框架 2.Topology的设计 3.记录 0. 89.201.10.122 - - [1528033390201] "GET /edit.php HTTP/1.1& ...

  6. HDU 3625 Examining the Rooms【第一类斯特灵数】

    <题目链接> <转载于 >>> > 题目大意:有n个锁着的房间和对应n扇门的n把钥匙,每个房间内有一把钥匙.你可以破坏一扇门,取出其中的钥匙,然后用取出钥匙打 ...

  7. kali上部署dvwa漏洞测试平台

    kali上部署dvwa漏洞测试平台 一.获取dvwa安装包并解压 二.赋予dvwa文件夹相应权限 三.配置Mysql数据库 四.启动apache2和mysql服务 五.在网页配置dvwa 六.登陆到D ...

  8. [ 原创 ] Centos7.6安装Mysql5.7

    https://blog.csdn.net/shj_php/article/details/86712408 CentOS7下安装MySQL5.7安装与配置(YUM) http://blog.csdn ...

  9. u3d 鼠标点击位置,物体移动过去。 U3d mouse clicks position, objects move past.

    u3d 鼠标点击位置,物体移动过去. U3d mouse clicks position, objects move past. 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱: ...

  10. Log4j教程

    Log4j教程 一.快速上手 log4j把日志分为:all,trace,debug,info,warnig,error,fital,off等几个级别.级别高的会屏蔽级别的的信息. 1)maven导入j ...