题目链接

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

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

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

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner; public class Main {
int upperBound(List<Integer> a, int x) {
int l = 0, r = a.size();
while (l + 1 < r) {
int mid = (l + r) >> 1;
if (a.get(mid) <= x) {
l = mid;
} else if (a.get(mid) > x) {
r = mid;
}
}
if (r < a.size() && a.get(r) <= x) r++;
return r;
} int lowerBound(List<Integer> a, int x) {
int l = 0, r = a.size();
while (l + 1 < r) {
int mid = (l + r) >> 1;
if (a.get(mid) < x) {
l = mid;
} else if (a.get(mid) >= x) {
r = mid;
}
}
if (a.get(l) >= x) l--;
return l;
} long query(List<Integer> a, int beg, int end) {
int b = lowerBound(a, beg), e = upperBound(a, end);
return e - b - 1;
} Main() {
Scanner cin = new Scanner(System.in);
int k = cin.nextInt();
char[] a = cin.next().trim().toLowerCase().toCharArray();
List<Integer> h = new ArrayList<>(a.length), i = new ArrayList<>(a.length), o = new ArrayList<>(a.length);
List<Integer> hio = new ArrayList<>(a.length);
for (int j = 0; j < a.length; j++) {
if (a[j] == 'h') {
h.add(j);
hio.add(j);
} else if (a[j] == 'i') {
i.add(j);
hio.add(j);
} else if (a[j] == 'o') {
o.add(j);
hio.add(j);
}
}
k /= 2;
long s = 0;
for (int j : hio) {
if (a[j] == 'h') {
s += query(i, j, j + k) * query(o, j, j + k);
} else if (a[j] == 'i') {
s += query(h, j, j + k) * query(o, j, j + k);
} else if (a[j] == 'o') {
s += query(h, j, j + k) * query(i, j, j + k);
}
}
System.out.println(s);
} public static void main(String[] args) {
new Main();
}
}

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. PTA之多项式求值

    时间限制: 400ms 内存限制: 64MB 代码长度限制: 16KB 函数接口定义: double f( int n, double a[], double x ); 其中n是多项式的阶数,a[]中 ...

  2. [转] 理解Web路由

    1. 什么是路由 在Web开发过程中,经常会遇到『路由』的概念.那么,到底什么是路由?简单来说,路由就是URL到函数的映射. 2. router和route的区别 route就是一条路由,它将一个UR ...

  3. 解决Linux下Qt编译出现"cannot find -lGL"以及无法安装libgl1-mesa-dev的问题

    在Linux系统下安装好Qt5,打开Qt Creator新建一个最简单的工程,编译却出现"cannot find -lGL"错误. 在网上搜索解决方法,找到的方案基本上是安装lib ...

  4. python学习之基础语法

    一.缩进 学习 Python 与其他语言最大的区别就是,Python 的代码块不使用大括号 {} 来控制类,函数以及其他逻辑判断.python 最具特色的就是用缩进来写模块. 缩进的空白数量是可变的, ...

  5. python学习之python安装

    1.下载python源码包 wget https://www.python.org/ftp/python/3.5.5/Python-3.5.5.tar.xz 2.下载  xz yum -y insta ...

  6. streaming优化:spark.streaming.receiver.maxRate

    使用spark.streaming.receiver.maxRate来限制你的吞吐的最大信息量. 因为当streaming程序的数据源的数据量突然变大巨大,可能会导致streaming被撑住导致吞吐不 ...

  7. [OpenCV-Python] OpenCV 中机器学习 部分 VIII

    部分 VIII机器学习 OpenCV-Python 中文教程(搬运)目录 46 K 近邻(k-Nearest Neighbour ) 46.1 理解 K 近邻目标 • 本节我们要理解 k 近邻(kNN ...

  8. linux centOS服务器部署ssh,免密码登陆linux

    登陆centos,切换用户,切换到你要免密码登陆的用户,进入到家目录 2 创建钥匙, [xun@jzlinux ~]$ ssh-keygen -t rsa Generating public/priv ...

  9. 从源码看Spring Boot 2.0.1

    Spring Boot 命名配置很少,却可以做到和其他配置复杂的框架相同的功能工作,从源码来看是怎么做到的. 我这里使用的Spring Boot版本是 2.0.1.RELEASE Spring Boo ...

  10. 动态规划_线性dp

    https://www.cnblogs.com/31415926535x/p/10415694.html 线性dp是很基础的一种动态规划,,经典题和他的变种有很多,比如两个串的LCS,LIS,最大子序 ...