跳转至

语言月赛 202408 于抑郁中支持

题目分析

  • 给定 $n$ 个整数 $a_i$ 和一个数字 $t$,需要根据每个 $a_i$ 的后 $t$ 位(即 $a_i \bmod 10^t$)区分事件;
  • 统计不同事件的数量,也就是不同后缀值的个数。

解题思路

  • 由于 $t \leq 4$,后 $t$ 位的最大取值为 $10^t - 1 \leq 9999$,范围较小;
  • 因此可以开一个大小为 $10^t$ (建议略大一点,如 $10005$)的布尔数组 vis 来标记每个后缀值是否出现过;
  • 定义 $p=10^t$。
  • 遍历所有 $a_i$,计算 x = a[i] % p,将 vis[x] 标记为 1
  • 统计 vis1 的数量即为不同事件数。

实现步骤

  • 计算 $p = 10^t$,用 pow 函数即可实现;
  • 开一个大小为 $10005$ 的布尔数组 vis,全部数组自动初始化都为 0
  • 遍历 $a$ 数组,计算 x = a[i] % p,标记 vis[x] = 1
  • 遍历 vis,统计为 1 的个数并输出。

复杂度分析

  • 时间复杂度:$O(n + p)$,$n$ 为输入长度,$p$ 为标记数组大小(最多 10000);
  • 空间复杂度:$O(p)$,布尔数组大小为 $10^t$,符合题目数据范围。

总结

  • 充分利用 $t$ 最大为 $4$,导致后缀取值范围有限,适合用数组标记;
  • 实现方便且节省内存,适合大数据量输入。