牛客寒假基础集训营 | Day1 G-eli和字符串
G-eli和字符串
题目描述
eli拿到了一个仅由小写字母组成的字符串。
她想截取一段连续子串,这个子串包含至少 kkkkkkkkk 个相同的某个字母。
她想知道,子串的长度最小值是多少?
注:所谓连续子串,指字符串删除头部和尾部的部分字符(也可以不删除)剩下的字符串。例如:对于字符串“arcaea”而言,“arc”、“rcae”都是其子串。而“car”、“aa”则不是它的子串。
输入描述:
第一行输入两个正整数 nnnnnnnnn 和 kkkkkkkkk(1≤k≤n≤2000001≤k≤n≤2000001≤k≤n≤2000001≤k≤n≤2000001 \le k \le n \le 2000001≤k≤n≤2000001≤k≤n≤2000001≤k≤n≤2000001≤k≤n≤200000)
输入仅有一行,为一个长度为 nnnnnnnnn 的、仅由小写字母组成的字符串。
输出描述:
如果无论怎么取都无法满足条件,输出 −1−1−1−1-1−1−1−1−1 。
否则输出一个正整数,为满足条件的子串长度最小值。
示例1
5 2
abeba
3
说明:选择“beb”子串,长度为3,其中包含相同的两个’b’
思路如下
方法类似于“尺取法”,也可以认为是尺取法 或 双针法,其实大致思路都一样,只不过是实现的方法不一样,,,它们的主要思路是:
- 先找到一个符合题意的区间,在这一题中就是 含有 k 个相同字母的区间。
- 之后在 保证这个区间符合题意的基础上不断缩小区间范围,去找到更短的区间 的答案,当该区间在缩小完之后 不符和题意了,那么在扩大这个区间,使该区间在此符合题意,此时再次进行 2 这一步操作
题解一(尺取法?)
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
const int Len = 200005;
int barrel[Len];
char ar[Len];
int main()
{
//freopen("T.txt","r",stdin);
map<char , int> mp;
int n,k;
cin >> n >> k >> ar;
int l = -1, r = -1;
//尺取 找到一个合适的区间
for(int i = 0; i < n; i ++)
{
mp[ar[i]] ++;
if(mp[ar[i]] == k)
{
r = i;
break;
}
}
if(r == -1)
{
cout<< -1 << endl;
return 0;
}
//不断缩紧、扩大区间
int len = 1e9;
while(l < r && l < n - k && r < n)
{
while(mp[ar[r]] == k && l < r)
{
len = min(len , r - l);
l ++;
mp[ar[l]] --;
}
r ++;
if(r == n) break;
mp[ar[r]] ++;
}
if(len == 1e9)
cout<<-1<<endl;
else
cout<<len<<endl;
return 0;
}
题解如下(双针法? 前缀和?)
#include<iostream>
#include<string>
using namespace std;
const int Len = 2e5 + 5;
int dp[Len][26];
int main()
{
int n,k;
string s;
cin >> n >> k >> s;
dp[0][s[0] - 'a'] = 1;
for(int i = 1; i < n; i ++)
{
for(int j = 0; j < 26; j ++)
{
dp[i][j] = dp[i - 1][j];
}
dp[i][s[i] - 'a'] ++;
}
//先找到一个合适的区间
int min_len = 1e9;
for(int i = 0; i < 26; i ++)
{
int l = 0,r = 0;
if(dp[n - 1][i] < k) continue;
while(l < n && dp[l][i] == 0) l ++;
while(r < n && dp[r][i] < k) r ++;
min_len = min(min_len , r - l + 1);
//对区间不断 扩大缩小范围
for(l ++; l < n; l ++)
{
if(s[l - 1] - 'a' == i)
{
r ++;
while(r < n && s[r] - 'a' != i) r ++;
if(r == n) break;
}
min_len = min(min_len , r - l + 1);
}
}
if(min_len != 1e9)
cout << min_len << endl;
else
cout << -1 << endl;
return 0;
}
牛客寒假基础集训营 | Day1 G-eli和字符串的更多相关文章
- 牛客寒假基础集训营 | Day1 J题—u's的影响力(水题)
Day1 J题-u's的影响力 有一天,kotori发现了一个和lovelive相似的游戏:bangdream.令她惊讶的是,这个游戏和lovelive居然是同一个公司出的! kotori经过一段时间 ...
- 牛客寒假基础集训营 | Day1 E-rin和快速迭代(暴力 + 优化)
E-rin和快速迭代 题目描述 rin最近喜欢上了数论. 然而数论实在太复杂了,她只能研究一些简单的问题. 这天,她在研究正整数因子个数的时候,想到了一个"快速迭代"算法.设 f( ...
- 牛客寒假基础集训营 | Day1 D-hanayo和米饭
D-hanayo和米饭 题目描述 hanayo很喜欢吃米饭. 有一天,她拿出了 nnnnnnnnn 个碗,第一个碗装了 111111111 粒米饭,第二个碗装了 222222222 粒米饭,以此类推, ...
- 牛客寒假算法基础集训营4 G Applese 的毒气炸弹
链接:https://ac.nowcoder.com/acm/contest/330/G来源:牛客网 众所周知,Applese 是个很强的选手,它的化学一定很好. 今天他又AK了一套题觉得很无聊,于是 ...
- 牛客noip前集训营(第一场)提高T1
链接:https://www.nowcoder.com/acm/contest/172/A来源:牛客网 题目描述 小N得到了一个非常神奇的序列A.这个序列长度为N,下标从1开始.A的一个子区间对应一个 ...
- 2020牛客NOIP赛前集训营-普及组(第二场)A-面试
面 试 面试 面试 题目描述 牛牛内推了好多人去牛客网参加面试,面试总共分四轮,每轮的面试官都会对面试者的发挥进行评分.评分有 A B C D 四种.如果面试者在四轮中有一次发挥被评为 D,或者两次发 ...
- 2020牛客NOIP赛前集训营-普及组(第二场) 题解
目录 T1 面试 描述 题目描述 输入描述: 输出描述: 题解 代码 T2 纸牌游戏 描述 题目描述 输入描述: 输出描述: 题解 代码 T3 涨薪 描述 题目描述 输入描述: 输出描述: 题解 代码 ...
- 2020牛客寒假算法基础集训营5 G街机争霸
题目描述 哎,又是银首,要是你这个签到题少WA一发就金了 牛牛战队的队员打完比赛以后又到了日常甩锅的时间.他们心情悲伤,吃完晚饭以后,大家相约到一个街机厅去solo.牛牛和牛能进入了一个迷宫,这个迷宫 ...
- 2020牛客寒假算法基础集训营3 G.牛牛的Link Power II (树状数组维护前缀和)
https://ac.nowcoder.com/acm/contest/3004/G 发现每个“1”对于它本身位置产生的影响贡献为0,对前面的“1”有产生贡献,对后面的"1"也产生 ...
随机推荐
- PHP把图片存入数据库(非路径)【待测试】
大部分人的图片上传都是保存一个路径到数据库,这样在插入时确实快,也符合web的特点,但是在删除时就很麻烦,需要找到文件并删除,该代码能够把代码直接存入数据库,删除时一并删除.请注意:这样的话数据库大小 ...
- Web实验一 国内旅游界面
Web实验一 旅游界面的设计 一.首页代码 <!DOCTYPE html> <html lang="zh-cn"> <head> <me ...
- Jenkins构建项目帮助文档
Jenkins构建项目帮助文档 主要步骤 一.配置jdk 1.1. 下载jdk,安装到自己电脑磁盘的Java目录下(比如:D:\Java\jdk). 1.2. Jdk环境变量的配置: 1. 鼠 ...
- Hyperledger Fabric ChainCode开发
预览 Hyperledger Fabric的chaincode开发目前支持Go.Java.Node.js语言,下面以Go语言作为例子,我们先看下面的一个官方提供chaincode模板 ··· pack ...
- 大龄IT人的新的一年
一转眼,工作十几年了,之前由于有时要出差,孩子偶尔放回老家,有时到处找人看孩子,虽然不出差时都是有我来带,孩子还是和我很亲,但是一直没时间关注她的学习,只是睡前读读绘本,报了个英语培训班,偶尔玩玩识字 ...
- ggplot2(8) 精雕细琢
8.1 主题 主题系统控制着图形中的非数据元素外观,它不会影响几何对象和标度等数据元素.这题不能改变图形的感官性质,但它可以使图形变得更具美感,满足整体一致性的要求.主题的控制包括标题.坐标轴标签.图 ...
- 大数据存储利器 - Hbase 基础图解
由于疫情原因在家办公,导致很长一段时间没有更新内容,这次终于带来一篇干货,是一篇关于 Hbase架构原理 的分享. Hbase 作为实时存储框架在大数据业务下承担着举足轻重的地位,可以说目前绝大多数大 ...
- synchronized实现原理及其优化-(自旋锁,偏向锁,轻量锁,重量锁)
1.synchronized概述: synchronized修饰的方法或代码块相当于并发中的临界区,即在同一时刻jvm只允许一个线程进入执行.synchronized是通过锁机制实现同一时刻只允许一个 ...
- 微信小程序修改request合法域名不生效及解决方法
在小程序微信公众平台修改后请求,依然在console中显示修改前的域名. 解决:在小程序开发者工具中点击“详情”后点击“域名信息”,就会自动刷新
- 分享几个 PHP 编码的最佳实践
对于初学者而言,可能很难理解为什么某些做法更安全. 但是,以下一些技巧可能超出了 PHP 的范围. 始终使用大括号 让我们看下面的代码: if (isset($condition) && ...