[语言月赛202304H] 写大作业 题解
[语言月赛202304H] 写大作业 题解
Source & Knowledge
2023 年 4 月语言月赛,由洛谷网校入门计划/基础计划提供。
本题考察字符串处理和算法技巧。
文字题解
题目大意
给出
解析
首先思考如何判定两个字符串经过重排后可以相同,容易发现等价的条件是每个字符在字符串内出现的次数相等。例如,对
60 分做法
可以依照题意模拟,每次对于操作 string 类的 += 运算符将两个字符串拼接:
if (o == 1) s[y] += s[x];
对于操作
注意每次操作之前都必须要清空
if (o == 2) {
for (int i = 0; i < 26; ++i) b[i] = 0;
for (int i = 0; i < s[x].length(); ++i)
++b[s[x][i] - 'a'];
for (int i = 0; i < s[y].length(); ++i)
--b[s[y][i] - 'a'];
if (count(b, b + 26, 0) == 26) { // 这个函数的意思是找 b[0] 到 b[25] 中 0 的数量,需要 algorithm 头文件
cout << "Yes\n";
} else {
cout << "No\n";
}
}
100 分做法
可以发现实际地拼接两个字符串是不必要的。我们最终检查的只是两串的字符出现数量。于是我们考虑直接维护字符出现数量。
具体地,设
这样合并两串的时候,只需要合并两串对应的
cin >> o >> x >> y;
if (o == 1) {
for (int j = 0; j < 26; ++j) b[y][j] += b[x][j];
} else {
bool ans = true;
for (int j = 0; j < 26; ++j) if (b[x][j] != b[y][j]) ans = false;
cout << (ans ? "Yes\n" : "No\n");
}
视频题解
完整代码请在视频题解中查看。