题目链接

给定一个长度小于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. windows10 更新后要输入2次密码才能进入系统

    解决办法: 设置---账户---登录选项---隐私---更新或重启后,使用我的登录信息自动完成设备设置.(关闭)

  2. poj 3903 poj 2533 (LIS模板题)

    pi1 < pi2 < ... < pik, with i1 < i2 < ... < ik. Sample Input 6 5 2 1 4 5 3 3 1 1 1 ...

  3. bzoj2654

    题解: 老早看的并没有写 wqs二分的原理和这个凸函数的性质已经证明过了 写的时候 主要的问题在于每次的答案是一个范围 什么意思呢 其实比较简单的做法是 优先取白边,优先取黑边做两次 然后看一下要求的 ...

  4. 【AtCoder】AGC018

    A - Getting Difference 我们肯定可以得到这些数的gcd,然后判断每个数减整数倍的gcd能否得到K #include <bits/stdc++.h> #define f ...

  5. free -m图解

  6. BZOJ1067 [SCOI2007]降雨量 线段树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1067 题意概括 给定n组整数对(Xi,Yi),当Xi<Xj且Yi>=Yj时,如果对于任 ...

  7. 076 Apache的HBase与cdh的sqoop集成(不建议不同版本之间的集成)

    1.修改sqoop的配资文件 2.从mysql导入到hbase(import) bin/sqoop import \ --connect jdbc:mysql://linux-hadoop3.ibei ...

  8. 038 关于HIVE的配置

    一:常用版本 1.版本 0.13.1 2014年 1.2.1   2015年 版本之间的区别:支持SQL不同,向关系型数据库靠拢. 目前看到的版本是2.3.2了. 2.官网 二:安装配置hive 1. ...

  9. python界面Tkinter编程(tkMessageBox对话框使用)

    python界面Tkinter编程(tkMessageBox对话框使用)     转载 https://blog.csdn.net/m_buddy/article/details/80105154 1 ...

  10. django-用户验证系统

    django提供了一套用户验证系统,但是要使用这个系统,必须要使用django内置的用户模型:django.contrib.auth.models.User,这个模型中预先定义了一些字段,其中只有us ...