首页 > 其他分享 >JOI2013 JOIOI の塔 (Tower of JOIOI)题解

JOI2013 JOIOI の塔 (Tower of JOIOI)题解

时间:2023-07-22 11:11:46浏览次数:33  
标签:pre -- 题解 JOIOI ++ int ow Tower

Description

给定一个由 JOI 组成的字符串,求最多能拆分成多少 JOIIOI

对于所有数据,\(1\leq \vert S\vert\leq 10^6\)。

Solution

先处理出 \(\text{pre}_i\) 为前缀 JI 的数量,即能组成多少个头部。

然后倒着做,维护当前拼出的 IOI 和最终成品的数量。遇到 JO 就模拟拼接,遇到 I 判断当前的 \(\text{pre}_i\) 是否小于等于 IOI 的总数量,若成立就拼成 IOI,否则作为 I

判断这个是因为 I 可以作为最后的 I 也可以作为开头的 I。若大于等于前缀 JI 数量则作为最后的 I 数量够用,无需继续拼接了。

时间复杂度 \(\mathcal{O}(n)\)。

Code

#include <bits/stdc++.h>
using namespace std;
namespace Milkcat {
    const int N = 2e7 + 5;
    int n, ow, w, tot, pre[N]; char s[N];
	int main() {
		cin >> n >> (s + 1);
		for (int i = 1; i <= n; i ++)
			pre[i] = pre[i - 1] + (s[i] == 'J' || s[i] == 'I');
		for (int i = n; i >= 1; i --) {
    		if (s[i] == 'J' && ow) ow --, tot ++;
    		if (s[i] == 'O' && w) w --, ow ++;
			if (s[i] == 'I') {
				if (ow + w >= pre[i] && ow) ow --, tot ++;
				else w ++;
			} 
		}
		cout << tot << '\n';
        return 0;
    }
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
    int T = 1;
    while (T --) Milkcat::main();
    return 0;
}

/*
15
NNOWWOONONWOWWO
*/

标签:pre,--,题解,JOIOI,++,int,ow,Tower
From: https://www.cnblogs.com/Milkcatqwq/p/17573017.html

相关文章

  • 【大联盟】20230703 T2 开心的序列(sequence) 题解 AT_agc049_f 【[AGC049F] Happy Sequ
    zak/bx恐怖zak将这题加强,出到模拟赛。直接把\(A_i,B_i\le10^5,C_i\le5\)变成了\(A_i,B_i,C_i\le10^9\)。非常恐怖。题目描述点击膜拜zhoukangyang。题解重新再理解一遍。我们维护\(p(x)=\sum_i|a_i-x|+|b_i-x|\),那么就相当于要求\(\forallx,p(x)\le0\),也就......
  • Luogu P4552 [Poetize6] IncDec Sequence 更好的题解
    原题链接第一步对于学过差分的人应该不难想定义差分数组$dis\quads.t.\quaddis[i]=a[i]-a[i-1]$那么不难发现问题一只要让\(dis[2]...dis[n]\)中全部为\(0\)即可区间\([l,r]\)加一操作在差分数组中意味着\(dis[l]=dis[l]+1,dis[r+1]=dis[r+1]-1\)即在差分数组......
  • 2023 暑假集训模拟赛题解
    目录CSP模拟1CSP模拟2FSYOCSP模拟1来自学长的馈赠2.CSP模拟2F考虑\(x\)只能在\(a_1\oplusb_i\)里选,那么分别代入暴力检验即可.时间复杂度\(\tilde\Theta(n^2)\),可以通过.S考虑交换同色的部分一定不优,所以同色字符的相对位置一定是不变的.那么操作序列......
  • 幽灵乐团 题解
    幽灵乐团题目大意\(T\)组数据,每组数据给定\(A,B,C\),求:\[\prod_{i=1}^A\prod_{j=1}^B\prod_{k=1}^C\Big(\frac{\text{lcm}(i,j)}{\gcd(i,k)}\Big)^{f(type)}\bmodp\]其中,\(type\in\{0,1,2\}\),\(f(0)=1,f(1)=i\timesj\timesk,f(2)=\gcd(i,j,k)\)。思路分析神经污......
  • 【问题解决】docker版本v23.0后,构建Dockerfile中FROM私库镜像报错构建失败
    问题情况Docker版本在v23.0以后,只要Dockerfile中FROM的私库镜像不存在本地,就会报错:#我本地是v24.0.2版本Docker[root@localhostipd]#dockerbuild.-tharbor.xxx.com.cn/test/bap:2.7.1[+]Building0.6s(3/3)FINISHED......
  • P9352 题解
    problem&blog。HerryHuang的DP专题中最喜欢的一题,抢第一篇题解/fendou。关于题意:只有往猫那里扔路障,猫才会动,否则只会原地坐牢。猫如果要走动,是一下子走到最高点,而不是慢慢挪动。假设猫在\(u\)点。现在往\(u\)扔路障,猫会跑去最高点,然后他无法返回到\(u\)的其他子......
  • SP12304 题解
    原题链接|题解链接本篇题解为此题最较简单做法及最较少码量,并且码风优良,请放心阅读。题目简述当\(i\)的所有正因数和\(=\)\(n\)时,其中\(i\)的最小值。思路首先需要完成求一个数的所有正因数之和的函数\(f(n)\)。要求此函数可返回传入参数的所有正因数之和,那么......
  • 【补充】时间出错问题解决
    【补充】时间出错问题解决TIME_ZONE='Asia/Shanghai'和USE_TZ=False是Django项目设置中的两个相关选项用于指定项目的时区和是否使用时区。【一】TIME_ZONE='Asia/Shanghai'这个设置用于指定项目所在的时区。在这个例子中,时区被设置为'Asia/Shanghai'表示项目位于......
  • P4843题解
    P4843题解原题连接建模一到比较裸的有源汇上下界最小流。每条边必走一次,要求求出最小的流量。由于比较裸,这里当作上下界流的例题讲。什么是有源汇上下界最小流顾名思义,就是在最大流的基础上增加了边的最小经过流量,使得整个网络可行,并且找出最小流量的方案。一个比较朴实的......
  • 列队春游题解 O(n方)
    题目前言出生镇楼思路:打个暴力先#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;namespaceTestify{inlineintread(){intf(1),x(0);charch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-......