[R26B]n+m

  • 难度 入门
  • 时限 1s
  • 空限 512m
  • 模拟

数据规模:1T101 \le T \le 101n,m101 \le n, m \le 101s301 \le |s| \le 30ss 仅由数字和 + 构成。

思路

字符串 ss 必须严格是「nn 位数字 + 一个 + + mm 位数字」的拼接,因此只需同时满足两个条件:

  1. ss 的第 nn 个位置(从 00 开始计数)必须是 +,其余位置必须全是数字。由于允许前导 00,其余位置只要是 09 即可,无需额外限制。
  2. ss 的总长度恰好为 n+m+1n + m + 1(前 nn 位 + 一个 + + 后 mm 位),保证 + 后面正好有 mm 位数字。

第一个条件保证了 + 出现的位置唯一且正确,第二个条件则排除「多出数字」或「数字不足」的情况。两者合起来即对应题目所要求的唯一分割方式。

题目保证 ss 仅由数字和 + 构成,这些都是 ASCII 字符(单字节),所以在仓颉里直接按字节(UInt8)遍历即可,无需区分字节与字符。

复杂度

每组数据时间 O(s)O(|s|),总计 O(Ts)O(T \cdot |s|);空间 O(s)O(|s|)

仓颉实现

import std.env.*
import std.convert.*

main(): Int64 {
    let reader = getStdIn()
    let t = Int64.parse(reader.readln().getOrThrow())
    for (_ in 0..t) {
        let line = reader.readln().getOrThrow().split(" ", removeEmpty: true)
        let n = Int64.parse(line[0])
        let m = Int64.parse(line[1])
        let s = reader.readln().getOrThrow()
        // s 仅含数字与 '+',均为 ASCII,故按字节遍历即可;字符数 == 字节数
        var idx: Int64 = 0
        var ok = true
        for (c in s) {
            let cb = Int64(c)
            if (idx == n) {
                if (cb != 43) {  // '+'
                    ok = false
                }
            } else {
                if (cb < 48 || cb > 57) {  // '0'..'9'
                    ok = false
                }
            }
            idx += 1
        }
        if (idx != n + m + 1) {
            ok = false
        }
        if (ok) {
            println("Yes")
        } else {
            println("No")
        }
    }
    return 0
}