hihocoder编程练习赛91:相邻字符串
给定一个长度小于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:相邻字符串的更多相关文章
- hihocoder编程练习赛52-1 字符串排序
思路: 将字符串按照新的顺序映射之后再排序. 实现: #include <bits/stdc++.h> using namespace std; int main() { int n; s ...
- hihoCoder编程练习赛52
题目1 : 字符串排序 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 一般我们在对字符串排序时,都会按照字典序排序.当字符串只包含小写字母时,相当于按字母表" ...
- hihocoder 编程练习赛23
第一题:H国的身份证号码I 题意:一个N位的正整数(首位不能是0).每位数字都小于等于K,并且任意相邻两位数字的乘积也小于等于K.按从小到大的顺序输出所有合法的N位号码,每个号码占一行. 思路:dfs ...
- hihoCoder编程练习赛72
题目1 : 玩具设计师 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho作为Z国知名玩具品牌AKIRE的首席设计师,对玩具零件的挑剔程度已经到了叹为观止的地步.所有 ...
- hihoCoder编程练习赛69
题目1 : 偶数长度回文子串 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个小写字母字符串,请判断它是否有长度为偶数的非空连续回文子串 输入 输入包含多组数据. ...
- hihocoder编程练习赛75
题目1 : 工作城市分配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 H公司在北京和上海两个城市各有一间办公室.该公司最近新招募了2N名员工,小Hi负责把这2N名员工 ...
- hihoCoder编程练习赛70
题目1 : 数位翻转 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 n,你可以进行若干次操作,每次操作可以翻转 n 的二进制表示下的某一位,即将 0 变成 ...
- hihoCoder编程练习赛67
题目1 : 序列 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个正整数 n, P,求满足以下两个条件的长度为 n 的序列 ai 个数: 1. 1 ≤ ai ≤ ...
- hihoCoder编程练习赛49
题目1 : 相似颜色 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在CSS中我们可以用井号(#)加6位十六进制数表示一种颜色,例如#000000是黑色,#ff0000 ...
随机推荐
- 使用共同函数,将PNotify弹出提示框公用
PNotify(http://sciactive.github.io/pnotify/)是个不错的jquery库(好像最新版的pnotify已不需要jquery了). 使用它来实现网站常用的提示框,很 ...
- Trident Topology开发Demo
1.项目结构 · 2.启动的服务 无 3.驱动程序 package com.jun.trident; import backtype.storm.Config; import backtype.sto ...
- KAFKA的安装使用
一:介绍 1.官网 kafka.apache.org 2.产生 Kafka由 linked-in 开源 kafka-即是解决上述这类问题的一个框架,它实现了生产者和消费者之间的无缝连接. kafk ...
- 打印不同对象的字节表示 ( 对int*强制转换成unsigned char*的理解 )
此文章参考<深入理解计算机系统>P31. 先看如下代码: 12345的十六进制表示为:0x00003039 #include <stdio.h> int main() { ; ...
- POJ 3304 Segments (叉乘判断线段相交)
<题目链接> 题目大意: 给出一些线段,判断是存在直线,使得该直线能够经过所有的线段.. 解题思路: 如果有存在这样的直线,过投影相交区域作直线的垂线,该垂线必定与每条线段相交,问题转化为 ...
- Java 并发编程整体介绍 | 内含超多干货
前段时间一直在学习多线程相关的知识,目前也算有了一个整体的认识,今天呢,主要从整体介绍一下,只谈造火箭,拧螺丝这种细节还需要自己深究. 首先是操作系统级别对于多线程的支持,由 CPU 的多级缓存.缓存 ...
- JavaFx 中常见的包和类(javafx笔记 )
JavaFx 中常见的包和类(javafx笔记 ) 更多详细内容请参考<Pro JavaFX 8>. javafx.stage 包包含以下类: Stage 类 Stage 类是任何 J ...
- Linux虚拟机上安装redis
1.检查安装依赖程序 yum install gcc-c++ yum install -y tcl yum install wget 2.获取安装文件 wget http://download.red ...
- C# 启动外部程序的几种常用方法汇总
. 启动外部程序,不等待其退出. . 启动外部程序,等待其退出. . 启动外部程序,无限等待其退出. . 启动外部程序,通过事件监视其退出. 实现代码如下: // using System.Diagn ...
- 潭州课堂25班:Ph201805201 python 模块 datetime,logging 第七课 (课堂笔记)
datetime 模块 # -*- coding: utf-8 -*-# 斌彬电脑# @Time : 2018/7/9 0009 20:42import datetime d = datetime.d ...