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的信息,所以要用一个数组来储存两个特殊点信息。
#两个相邻特殊点之间的不定长度段
#构造