进站占优段要求每个前缀里 0 的个数都严格大于 1 的个数。因此任何进站占优段的左端点都必须是 0。
先考虑弱化条件:每个前缀中 0 的个数不少于 1 的个数。这等价于每个 1 都能在它左边找到一个尚未配对的 0。从右往左扫描,用栈存放尚未配对的 1 的位置;遇到 1 入栈,遇到 0 则弹出一个 1。扫描到位置 i 时,栈顶就是从 i 出发、在弱化意义下第一个非法右端点 p[i]。
原问题比弱化条件更严格。左端点 i 必须是 0:若 i 已是最后一个位置,贡献为 1;否则弱化最长合法段是 [i+1,p[i+1]],加上左端这个额外的 0 后,严格最长合法段是 [i,p[i+1]],贡献为 p[i+1]−i。对所有 0 位置累加即得答案。
实现时不必显式求出整个 p 数组,栈模拟过程中直接累加即可。
地铁站闸机把一次班次内的刷卡结果记成只含字符 0 和 1 的字符串 s。其中 0 表示进站成功,1 表示出站成功。调度员把一段连续日志称为进站占优段,当且仅当它的每一个前缀里,字符 0 的个数都严格大于字符 1 的个数。请统计 s 中有多少个进站占优段。
约束:字符串长度不超过 105。
输入一行一个只含字符 0 和 1 的字符串 s,长度满足 1≤∣s∣≤105。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.