1 条题解

  • 0
    @ 2026-6-19 10:30:25

    📝 题目大意

    给定 NN 个长度为 66 的数字字符串 SiS_iMM 个长度为 33 的数字字符串 TjT_j,统计有多少个 SiS_i 的末尾 33 个字符与任意一个 TjT_j 完全相同。

    💡 解题思路

    1. 题目分析

      • N,M1000N, M \leq 1000,数据规模很小,O(NM)O(NM) 的暴力枚举最多 10610^6 次比较,完全可行。
      • SiS_i 长度固定为 66TjT_j 长度固定为 33,无需考虑变长情况。
      • 每个 SiS_i 只要其末尾三位与 任意一个 TjT_j 匹配即可计数,匹配后立即 break 避免重复计数。
    2. 算法推导

      • 提取后缀:对于每个 SiS_i,用 s.substr(3) 提取索引 353 \sim 5 的子串(即末尾三位),存入数组 s1
      • 读入目标:将 MMTjT_j 存入数组 t
      • 暴力匹配:两层循环遍历每个 s1[i] 与每个 t[j],若相等则 x++break 跳出内层循环,继续处理下一个 SiS_i
      • 输出答案:最终输出计数器 x
    3. 边界与细节

      • SiS_i 可能重复(如样例 3 中 000000 出现两次),每个 SiS_i 独立计数,重复是允许的。
      • TjT_j 也可能重复(如样例 3 中 111 出现两次),不影响匹配逻辑。
      • substr(3) 传入一个参数表示从索引 3 开始直到末尾,由于字符串长度正好为 6,恰好取到末尾三位。

    ⏱️ 复杂度分析

    • 时间复杂度O(NM)O(NM),最坏 10610^6 次字符串比较,足以通过。
    • 空间复杂度O(N+M)O(N + M),存储 NN 个后缀和 MM 个目标串。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    int n, m, x;                     // x 为答案计数器
    string s, s1[1001], t[1001];     // s1 存储每个 S_i 的末尾三位
    int main() {
        cin >> n >> m;
        for (int i = 0; i < n; i++) {
            cin >> s;
            s1[i] = s.substr(3);     // 从索引 3 开始截取,即末尾三位
        }
        for (int i = 0; i < m; i++) {
            cin >> t[i];             // 读入所有目标后缀 T_j
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (t[j] == s1[i]) { // 匹配成功
                    x++;
                    break;           // 只要匹配任意一个 T_j 即可,跳出内层循环
                }
            }
        }
        cout << x;
        return 0;
    }
    
    • 1

    信息

    ID
    675
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者