(构造)(两个相邻特殊点之间的不定长度段维护) Dango

C - Dango (atcoder.jp)

#include <iostream>
#include <string>
using namespace std;

int main() {
    int N;
    cin >> N;
    string S;
    cin >> S;

    S = S + '-';
//    末尾+‘-’
    int ans = -1;
    int j = -1;
    for (int i = 0; i <= N; i++) {
        if (S[i] == '-') {
//        	结尾
            int l = i - j - 1;
//            求不包含两个端点的段长度.
//            如果没有前导-,那长度应该是0到i-1这一段.
//            前导-等价于是在-1位置所以不用分类讨论求解.
//            两个-之间的距离
            if (l > 0 && (j >= 0 || i < N)) {
                ans = max(ans, l);
//                N位置的-是手动加上来判断辅助前导-判断的,所以要判一下其中一个-有意义.
//					如果整个串只有一个-存在,l = 0,此时是不应该更新ans的,所以要判断一下
//                找到过l且j和i其中一个-是有意义的。
            }
            j = i;
//            记录遇到的前一个-

//通过末尾加-,变成需要特判结尾-的求两个--之间的长度问题.
//同类题,外卖店优先级.
//记录两份订单之间的状态

        }
    }
    cout << ans << endl;
    return 0;
}
//Exactly one of the first character and the last character is -, and the other 
//L characters are o.
//忽略了题意-oo也是有意义的.
//看到要求后就应该在脑海里想符合条件的形式再开始做判断.

套路:

1)求两点之间不包括自身的段长度

r - l - 1

2)维护两个相邻特殊点之间的不定长度段信息

前提:
题目给的一段字符串,或者给出几个可以放在时间轴上的点,要维护点之间的信息。
或者是求以一个特殊点为开头,或一个特殊点为结尾的段的信息。
情景:

原文:
1)- Dango
For a positive integer L, a level-L dango string is a string that satisfies the following conditions.
- It is a string of length L+1 consisting of o and -.
- Exactly one of the first character and the last character is -, and the other L characters are o.
- You are given a string S of length N consisting of the two characters o and -. Find the greatest positive integer X that satisfies the following condition.
简述
一个dango字符串需要满足头和尾字符是有一个是-,一个是o,寻找包含最多o的dango字符串


2)外卖店优先级给定 T 时刻以内的 M 条订单信息,请你计算 T 时刻时有多少外卖店在优先缓存中。

应对:如何找到这个段?

可能要的前置构造
以一个特殊点为开头,或一个特殊点为结尾的段的信息同时需要维护时,可以通过构造来在字符串,时间轴上加上一个边界,来维护以一个特殊点为开头的情况,然后操作时要加一个判断来处理这个边界的情况


特殊点
构造后,变为求两端是-的子串的最大o长度,
要求o的长度,所以-就是特殊点,用一个变量记录上一次遇到的-,循环时遇到了-就
可以与上一次遇到的-之间形成一个段,根据题意进行不同的操作维护信息。

核心代码:

if (S[i] == '-') {
	int len = i - l - 1;
	...
	l = i;
}

如果还有更多信息
至于外卖店优先级,由于题目里一个段内还要维护多个id的信息,所以要用一个数组来储存两个特殊点信息。

#两个相邻特殊点之间的不定长度段
#构造

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值