题解 B4086
[语言月赛 202412] 正在联系教练退赛 题解
Source & Knowledge
本题来源于 2024 年 12 月的语言月赛,主要考察字符串操作和循环结构。
文字题解
题目大意
题目要求检查每支队伍的名称是否包含主办方字典中的任何字符串作为子串。如果包含,则输出 "Yes",表示该队伍需要退赛;否则输出 "No"。
解析
读入
首先读取队伍数量 n 和队伍名称,然后读取字典的大小 m 和字典中的字符串。
int n, m;
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> s[i];
}
cin >> m;
for (int i = 0; i < m; ++i) {
cin >> t[i];
}
检查子串
对于每个队伍名称 s[i],我们需要检查它是否包含字典中的任何一个字符串 t[j] 作为子串。
for (int i = 0; i < n; ++i) {
bool flag = false; // 标记是否需要退赛
for (int j = 0; j < m; ++j) {
// 检查 s[i] 中是否包含 t[j]
for (int p = 0; p < int(s[i].size()); ++p) {
// substr 的第二个参数是子串长度,如果超出范围,它会返回剩余的部分
if (s[i].substr(p, t[j].size()) == t[j]) {
flag = true;
break; // 找到子串,跳出内层循环
}
}
if (flag) break; // 队伍需要退赛,跳出外层循环
}
// 根据标记输出结果
if (flag) cout << "Yes\n";
else cout << "No\n";
}
输出
根据上述检查,输出每支队伍是否需要退赛的结果。
代码注释
s[i].substr(p, t[j].size()):使用substr函数来获取s[i]从位置p开始长度为t[j].size()的子串。如果p + t[j].size()超出了s[i]的长度,substr将只返回从p开始到s[i]结尾的部分。