[2021.11.19]UPC-2021级新生个人训练赛第4场-19276 Problem B ok 字符串

2024-04-14 18:32

本文主要是介绍[2021.11.19]UPC-2021级新生个人训练赛第4场-19276 Problem B ok 字符串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

商场中展示了这么多玩具,乐乐爱不释手。现在游戏环节开始,只要你能解决一个问题,就能够挑选一件精美的玩具。此时,乐乐需要你们这帮“牛娃”的帮助,请你帮助乐乐解决这个问题。 
现在给你一个长度为 n 的字符串,该字符串只包含字符’o’和’k’。你最多可以修改 t 个字符(将字符’o’改为字符’k’或将字符’k’改为字符’o’),使得某一段连续相同的字符个数是最多的。
例如:  ‘ooooo’或’kkkkk’像这样的连续相同字符都可以。 
请你经过不多于t次地合理修改,帮助乐乐求出字符串某一段连续相同的字符最多个数。

输入

第一行输入整数 n 和 t,分别表示字符串的总长度和最多可以修改的字符数。 
第二行输入一行字符串,仅包含字符‘o‘或‘k‘。

输出

输出一个整数,表示经过不多于 t 次地合理修改,字符串某一段连续相同的字符最多个数

样例输入 Copy

【样例1】
4 2 
okko 
【样例2】
8 3 
ookookoo 

样例输出 Copy

【样例1】
4
【样例2】
8

提示

样例一:通过 2 次修改后,可以获得字符串‘oooo‘或‘kkkk‘,所以连续的字符个数是 4。 
样例二:虽然 t 是 3,但只需通过 2 次修改后,可以获得字符串‘oooooooo‘,连续的字符个数是 8。 

对于 80%的数据,保证 1<=n<=10000,0<=t<=n。 
对于另外 20%的数据,保证 n<=1000000, 0<=t<=10000,并保证字符‘o‘的总个数<=10000
或字符‘k‘的总个数<=10000。 

我这个做法属实复杂了!: ( 

但好像大家思路都大致相同~:从前到后遍历字符串,(我这个是从后到前)记录o和k出现的次数

如果修改次数足以让当前所遍历的字符串变成连续的,就继续往下遍历,记录下当前字符串长度,再与所记录的最大长度进行比较。

如果不能让当前字符串变为连续的,就从前往后缩减字符串长度,直至修改次数可以使当前字符串变为连续的,记录下当前字符串长度,再与所记录的最大长度进行比较。

通过这个思路,大家应该能轻松编出比我简单得多得多的代码 ;),或者直接在CSDN里搜往届学长的代码也行~

以下是我的代码 : )

#include <cstdio>
using namespace std;
int c[1000010];    //c[i]用于记录从0到i为止o和k字符出现的次数
int main(){char a;int n,j,k,i,ans=1;scanf("%d %d",&n,&k);scanf(" %c",&a);if(a=='o')c[0]=1;        //若为o  则为1elsec[0]=-1;        //若为k  则为-1for(i=1;i<n;i++){scanf("%c",&a);if(a=='o')c[i]=c[i-1]+1;elsec[i]=c[i-1]-1;  }for(i=n-1;i>=ans;i--)    //当i<=当前所记录的最大的经修改后的连续字符串长度时退出循环for(j=-1;j<i;j++){    //因为不可能得到更长的连续字符串了if (j == -1) {    //j为-1时 说明不需要缩减长度,if (c[i]+2*k>=i+1 || c[i]- 2*k<=-(i+1)){  //判断是否可以修改为连续字符串if (i - j + 1 > ans){  ans = i + 1;}break;}}else {    if (c[i] - c[j] + 2*k >= i - j|| c[i] - c[j] - 2*k <= -(i-j)) {if (i - j > ans){ans = i - j;}break;};}}printf("%d ",ans);return 0;
}

U

这篇关于[2021.11.19]UPC-2021级新生个人训练赛第4场-19276 Problem B ok 字符串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/903690

相关文章

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank&nbsp;正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

分布式系统的个人理解小结

分布式系统:分的微小服务,以小而独立的业务为单位,形成子系统。 然后分布式系统中需要有统一的调用,形成大的聚合服务。 同时,微服务群,需要有交流(通讯,注册中心,同步,异步),有管理(监控,调度)。 对外服务,需要有控制的对外开发,安全网关。

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

C和指针:字符串

字符串、字符和字节 字符串基础 字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。 字符串长度就是字符串中字符数。 size_t strlen( char const *string ); string为指针常量(const修饰string),指向的string是常量不能修改。size_t是无符号数,定义在stddef.h。 #include <stddef.h>

PHP字符串全排列

方法一: $str = 'abc';$a =str_split($str);perm($a, 0, count($a)-1);function perm(&$ar, $k, $m) {if($k == $m){ echo join('',$ar), PHP_EOL;}else {for($i=$k; $i<=$m; $i++) {swap($ar[$k], $ar[$i]);perm($ar

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析

PHP7扩展开发之字符串处理

前言 这次,我们来看看字符串在PHP扩展里面如何处理。 示例代码如下: <?phpfunction str_concat($prefix, $string) {$len = strlen($prefix);$substr = substr($string, 0, $len);if ($substr != $prefix) {return $prefix." ".$string;} else