首页 > 其他分享 >ABC300F 题解

ABC300F 题解

时间:2023-06-07 16:01:20浏览次数:43  
标签:ABC300F int 题解 texttt times leq 字符串

前两天忘发出来了,补一下QAQ

题目链接

题意简述

给定一个长度为 \(n\) 且只包含 \(\texttt{o}\) 和 \(\texttt{x}\) 的字符串 \(s\) 以及正整数 \(n\) \(m\) \(k\),令字符串 \(T=s^{m}\),求将 \(T\) 中的 \(k\) 个 \(\texttt{x}\) 变成 \(\texttt{o}\) 之后,\(T\) 中连续 \(\texttt{o}\) 的最长长度。

  • \(1\leq n\leq 3\times 10^5\)
  • \(1\leq m\leq 10^9\)
  • 保证 \(k\) 不超过 \(T\) 中 \(\texttt{x}\) 的数量

题目分析

设 \(l,r\) 分别是修改 \(k\) 个 \(\texttt{x}\) 后最长全是 \(\texttt{o}\) 的子串的左右端点在 \(T\) 中的下标(下文默认从1开始)。

由于字符串 \(T\) 由 \(m\) 个相同的字符串 \(s\) 拼成,左端点在第一个 \(s\) 内部时一定能取到最优答案,即 \(1\leq l\leq n\)。

于是,我们只需要对每个可行的 \(l\),计算在 \(k\) 的限制内,可取到的最右边的 \(r\),答案就为 \(\max\{r-l+1\}\)。

当 \(l\) 已经确定时,我们分两种情况计算 \(r\):

  • 当修改 \(k\) 个 \(\texttt{x}\) 不足以把 \(T_{l,n}\) 全变为 \(\texttt{o}\) 时,直接在 \([l,n]\) 的范围内计算 \(r\)。具体实现可以前缀和以及预处理,见参考代码。

  • 其他情况下,\(r\) 一定大于 \(n\),设 \(r\) 在第 \(i\) 段字符串 \(s\) 中,我们将最终选出的子串分为三部分:

    左侧的边角块,即 \([l,n]\);

    若 \(i\neq 2\),中间的整块 \([n+1,(i-1)\times n]\);

    右侧的边角块,即 \([(i-1)\times n+1,r]\)。

    分别对应图中绿色、蓝色、粉色部分。

    对每一块分别计算即可。

参考代码

#include<bits/stdc++.h>

using namespace std;

const int N=300010;

typedef long long ll;
ll n,m,k,K,len,cst1[N],cst2[N],maxv[N],ans;
string s;

void solve(){
	for(int i=1; i<=n; i++){
		if(k-cst2[i]<0){
			ans=max(ans,maxv[k+cst1[i-1]]-i+1);
			continue;
		}
		ans=max(ans,n-i+1+min((k-cst2[i])/len,m-1)*n+(((1+(k-cst2[i])/len)<m)?maxv[(k-cst2[i])%len]:0));
	}
	
	cout<<ans<<endl;
	
}

int main(){
	
	cin>>n>>m>>k>>s;
	
	for(auto c:s) len+=(c=='x');
	
	for(int i=0,cc=0; i<n; i++){
		if(s[i]=='x') cc++;
		cst1[i+1]=cc;
		maxv[cc]=max(maxv[cc],(ll)i+1);
	}
	
	for(int cc=0,i=n-1; ~i; i--){
		if(s[i]=='x') cc++;
		cst2[i+1]=cc;
	}
	
	solve();
	
	return 0;
}

标签:ABC300F,int,题解,texttt,times,leq,字符串
From: https://www.cnblogs.com/FreshOrange/p/17463543.html

相关文章

  • P3392 涂国旗 题解
    题目大意题目真的是不说人话......有一个国家的国旗是由一个N*M的方格组成的。如果想要这面国旗合法,就必须满足要求:国旗从上到下必须是白色、蓝色和红色,顺序不能改变。每一种颜色都至少有一行。小a这时候捡到了一块破布,希望你通过涂颜色的方式,把破布成合法的国旗,并且要......
  • 题解 P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并
    传送门如题目所言,这就是个线段树合并的板子题。题目大意题目描述首先村落里的一共有\(n\)座房屋,并形成一个树状结构。然后救济粮分\(m\)次发放,每次选择两个房屋\((x,y)\),然后对于\(x\)到\(y\)的路径上(含\(x\)和\(y\))每座房子里发放一袋\(z\)类型的救济粮。然......
  • 【每日一题】LeetCode 786. 第K个最小的素数分数(待补全题解思路)
    题目给你一个按递增顺序排序的数组arr和一个整数k。数组arr由1和若干素数组成,且其中所有整数互不相同。对于每对满足0<i<j<arr.length的i和j,可以得到分数arr[i]/arr[j]。那么第k个最小的分数是多少呢?以长度为2的整数数组返回你的答案,这里answer......
  • 2023上半年(下午)网络工程师试题解析
    2023上半年(下午)网络工程师试题解析试题一(20分)某企业办公楼网络拓扑如图1-1所示。该网络中交换机Switch1-Switch4均是二层设备,分布在办公楼的各层,上联采用千兆光纤。核心交换机、防火墙、服务器部署在数据机房,其中核心交换机实现冗余配置。图1-1问题1(4分)该企业办公网络采用172.16.1......
  • CF1559D2 Mocha and Diana (Hard Version) 题解
    Luogu|Codeforces题意给定两个森林\(A\)和\(B\),均有编号\(1\)到\(n\)的节点,边数分别为\(m_1,m_2\)。现在进行加边操作,但是有两个要求:如果在第一个森林加一条\((u,v)\)的边,第二个森林也要进行同样的操作。反之同理。加边后两个森林依旧是森林。一棵树也是森林。......
  • 应用问题解决-分布式锁(LUA保证删除原子性)
    问题:删除操作缺乏原子性场景1、index1获得锁、执行具体操作、比较lock的uuid值确实和自己生成的uuid是否相等,相等则删除锁。uuid=v1set(lock,uuid)uuid.equals(get("lock"))2、但是index1执行删除前,lock刚好过期时间已经到了,被redis自动释放3、此时index2获取锁,执行具体......
  • 在centos7升级nodejs存在的无法切换版本的问题解决
    1.安装n管理工具npminstall-gn安装最新版本nlatest安装指定版本 n8.11.3 2.切换nodejs版本n选择已安装的版本 ο node/8.11.3  node/10.4.1查看当前版本node-v,下面表示已切换成功v8.13.3但问题来了,切换后,查看版本还是原来的v6.13.3,看下面 使用n切换nodejs......
  • 应用问题解决——缓存穿透、缓存击穿、缓存雪崩
    一、缓存穿透缓存穿透:key对应的数据在数据源并不存在,每次针对key的请求从缓存中获取不到,请求都会压到数据源,从而可能压垮数据源,比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库现象:1、应用服务器压力变大2、redis命中率......
  • Meteors 题解
    Meteors蒟蒻初学整体二分,写一篇题解记录一下思考与看法。题目大意在一个环形的轨道上分别着若干国家的空间站,在接下来的一段时间内会出现若干次陨石,每次出现在环形的某一段轨道,每个国家都想收集一定量的陨石,需要判断每个国家最少在什么时候可以集齐所需的陨石。思路分析首先......
  • Full Tank 题解
    FullTank题目大意给定一张\(n\)个点,\(m\)条边的连通无向图,在每个点有一个加油站,油价为该点的点权,每条边的油耗为该边的边权。现给出若干询问,问一辆油箱容量为\(c\)的车子是否能从\(s\)开到\(e\),如果可以,求出最小所需的钱。思路分析看到这种有图有权求最小消耗的题,我......