1 条题解
-
0
📝 题目大意
给定 个长度为 的数字字符串 和 个长度为 的数字字符串 ,统计有多少个 的末尾 个字符与任意一个 完全相同。
💡 解题思路
-
题目分析:
- ,数据规模很小, 的暴力枚举最多 次比较,完全可行。
- 长度固定为 , 长度固定为 ,无需考虑变长情况。
- 每个 只要其末尾三位与 任意一个 匹配即可计数,匹配后立即
break避免重复计数。
-
算法推导:
- 提取后缀:对于每个 ,用
s.substr(3)提取索引 的子串(即末尾三位),存入数组s1。 - 读入目标:将 个 存入数组
t。 - 暴力匹配:两层循环遍历每个
s1[i]与每个t[j],若相等则x++并break跳出内层循环,继续处理下一个 。 - 输出答案:最终输出计数器
x。
- 提取后缀:对于每个 ,用
-
边界与细节:
- 可能重复(如样例 3 中
000000出现两次),每个 独立计数,重复是允许的。 - 也可能重复(如样例 3 中
111出现两次),不影响匹配逻辑。 substr(3)传入一个参数表示从索引 3 开始直到末尾,由于字符串长度正好为 6,恰好取到末尾三位。
- 可能重复(如样例 3 中
⏱️ 复杂度分析
- 时间复杂度:,最坏 次字符串比较,足以通过。
- 空间复杂度:,存储 个后缀和 个目标串。
💻 标准代码 (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
- 上传者