【前缀和+开区间二分】codeforces 1187 B. Letters Shop
题意
第一行,输入一个正整数 \(n(1 \leq n \leq 2*10^5)\),代表字符串 \(s\) 的长度。
第二行,输入一个字符串 \(s\)。
第三行,输入一个正整数 \(m(1 \leq m \leq 5*10^4)\),代表接下来要输入的询问次数,对于每次询问:输入一个字符串 \(t(1 \leq |t| \leq 2*10^5)\),并保证 \(\sum_{i=1}^m{|t_i|} \leq 2*10^5\)。
保证:所有字符串中的字符只包含小写英文字母。
对于每个 \(t\),你需要在 \(s\) 中找出一个前缀,满足能在该前缀中找出一个子序列,经过任意顺序的调换以后,若能构造出 \(t\),则视为一个合法前缀。保证:每个 \(t\) 都能在 \(s\) 中找到至少一个合法前缀。
对于每个 \(t\),输出合法前缀的最短长度。
题解
维护 \(s\) 在区间 \((0, n + 1)\) 每个位置上的26个字母的出现频度,然后使用二分法查找出满足每个字母的出现频率都比 \(t\) 大的最短合法前缀。
此题保证了每个 \(t\) 都能在 \(s\) 找到至少一个合法前缀,因此在区间 \((0, n + 1)\) 上必定存在合法解。
问:若没有保证一定有解呢?该如何使用二分法维护答案?
答:使用开区间二分,若返回值落在开区间的边界上,则说明必定无解。
参考代码
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using namespace std;
constexpr int N = 26;
int T = 1, n, m;
int a[N];
string s, t;
bool check(int mid, vector<vector<int>>& pre) {
for (int i = 0; i < 26; ++ i) if (pre[i][mid] < a[i]) return false;
return true;
}
int main() {
IOS
cin >> n >> s;
vector<vector<int>> pre(26, vector<int>(n + 1));
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < 26; ++ j) pre[j][i + 1] = pre[j][i];
pre[s[i] - 'a'][i + 1] ++;
}
cin >> m;
while (m --) {
for (int i = 0; i < 26; ++ i) a[i] = 0;
cin >> t;
for (auto &c: t) a[c - 'a'] ++;
int left = 0, right = n + 1, middle;
while (left + 1 < right) {
middle = left + right >> 1;
(check(middle, pre) ? right : left) = middle;
}
cout << right << '\n';
}
return 0;
}
【前缀和+开区间二分】codeforces 1187 B. Letters Shop的更多相关文章
- Letters Shop
B. Letters Shop time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- Codeforces 899 F. Letters Removing (二分、树状数组)
题目链接:Letters Removing 题意: 给你一个长度为n的字符串,给出m次操作.每次操作给出一个l,r和一个字符c,要求删除字符串l到r之间所有的c. 题解: 看样例可以看出,这题最大的难 ...
- D. Frets On Fire 【二分,前缀和】 (Codeforces Global Round 2)
题目传送门:http://codeforces.com/contest/1119/problem/D D. Frets On Fire time limit per test 1.5 seconds ...
- CodeForces - 948C (前缀和+二分)
博客界面的小人搞不好导致无心写博客 题意:tyd非常喜欢玩雪,下雪下了n天,第i天她会堆一堆大小为Vi的雪堆,但因为天气原因,每堆雪会融化Ti,问每天总共融化了多少雪: 直接上代码+注释 1 #inc ...
- 牛客练习赛46 B 华华送奕奕小礼物 (预处理前缀和,二分)
链接:https://ac.nowcoder.com/acm/contest/894/B?&headNav=acm 来源:牛客网 华华送奕奕小礼物 时间限制:C/C++ 1秒,其他语言2秒 空 ...
- Codeforces Problem 708A Letters Cyclic Shift
题目链接: http://codeforces.com/problemset/problem/708/A 题目大意: 从字符串s中挑选出一个子串(非空),将该子串中的每个字母均替换成前一个字母,如' ...
- codeforces 709C C. Letters Cyclic Shift(贪心)
题目链接: C. Letters Cyclic Shift 题意: 现在一串小写的英文字符,每个字符可以变成它前边的字符即b-a,c-a,a-z这样,选一个字串变换,使得得到的字符串字典序最小; 思路 ...
- NOIP2015运输计划(树上前缀和+LCA+二分)
Description 公元 2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球. 小 P 掌管 ...
- Codeforces 1009G Allowed Letters 最大流转最小割 sosdp
Allowed Letters 最直观的想法是贪心取, 然后网络流取check可不可行, 然后T了. 想到最大流可以等于最小割, 那么我们状压枚举字符代表的6个点连向汇点是否断掉, 然后再枚举64个本 ...
- 前缀和的应用 CodeForces - 932B Recursive Queries
题目链接: https://vjudge.net/problem/1377985/origin 题目大意就是要你把一个数字拆开,然后相乘. 要求得数要小于9,否则递归下去. 这里用到一个递归函数: i ...
随机推荐
- 【赵渝强老师】NoSQL数据库之Cassandra基础
一.Cassandra简介 Cassandra是一个混合型的非关系的数据库,类似于Google的BigTable.其主要功能比Dynamo (分布式的Key-Value存储系统)更丰富,但支持度却不如 ...
- manim边学边做--形状匹配
manim中有几个特殊的用于形状匹配的对象,它们的作用是标记和注释已有的对象,本身一般不单独使用. 形状匹配对象一共有4种: BackgroundRectangle:为已有的对象提供一个矩形的背景 C ...
- TEN Framework 入坑记
TL;DR TEN Framework 最初叫 Astra,后改为 TEN,即 Transformative Extensions Network. 我第一次见到 TEN (那时还叫 Astra)是在 ...
- android中的render线程是什么?
在 Android 中,Render 线程(也称为渲染线程)是一个专门用于处理 UI 绘制和动画的线程.它的主要职责是确保用户界面在屏幕上流畅且高效地呈现.这个线程的引入是为了将渲染任务从主线程(UI ...
- 利用3Dslice提取血管中心线
1.首先进入官网下载你需要的版本.你也可以安装老版本,我已经用红色框框出来了. 2.开始安装,等个几十秒钟就ok了. 3.当然要实现提取中心线,还需要 VMTK 这个玩意, 打开应用,找到 insta ...
- 共124篇!墨天轮“高可用架构”干货文档分享(含Oracle、MySQL、PG)
大家期待的高可用篇来啦!在上期<墨天轮高分技术文档分享-Oracle升级迁移篇>中大家对数据库高可用架构相关文档呼声较高,这不就来啦! 数据库的高可用架构能够在发生宕机或意外中断等故障时起 ...
- Whizard:跨越 Thanos 从开源项目到生产就绪的鸿沟
此文是根据 KubeSphere 在 KubeCon China 2024 上的演讲分享整理而成. 议题简介 作为最受欢迎和强大的 Prometheus 长期存储项目之一,Thanos 被社区广泛采用 ...
- 云原生爱好者周刊:OCI 镜像管理新工具 — regclient
云原生一周动态要闻: OpenKruise v1.0 发布 SlashData 最新报告:560 万开发者使用 Kubernetes,一年增长 67% WasmEdge 0.9.0 发布 Securi ...
- C语言之声明
C语言之声明 1.声明与定义 声明语法 说明符(说明类型或修改缺省属性) 声明表达式列表 说明符 类型说明:int, float 存储属性:static,auto 类型限定:const, volati ...
- Ubuntu 22.04 LTS 在线/离线安装 Docker
Docker 安装方式 时间:2024-10 准备环境 root@ubuntu2204:~# hostnamectl Static hostname: ubuntu2204 Icon name: co ...