这道题在月赛的时候我本来是 想用 string 稳过的,结果发现看不懂题,没理解不合法的情况,看了看题解没有 dalao 用 string 解,我就来用 string 解一下这道题。
这道题完全可以用字符串来解决,我在这里 @文·和 可以参考一下。
思路
首先,这道题其实我们完全可以自定义它高出的分数,那么我们就以 0 和 1 为例。
先完成合法情况:
合法情况很简单,只需要判断给定的字符串中出现的 X,Y,Z;
那么 74 分代码就出现了
for (int i = 0; i <= f.size(); ++i) {
if (f[i] == 'Z') {
a += '0', b += '0';
}
if (f[i] == 'X') {
a += '1', b += '0';
}
if (f[i] == 'Y') {
a += '0', b += '1';
}
}
然后 我们来考虑一下不合法的情况,共有3种。
当Z位于字符串最后一位且前面没有出现Z的时候,是合法的。
当Z存在于字符串中间的时候,不合法。
当Z存在于字符串中间但其后面全都是Z的时候,合法。
那么我们可以写出 判断函数
bool canot() {
int len = f.size(), cnt = 0;
for (int i = len - 1; i >= 0; i--)
if (f[i] == 'Z') can[++cnt] = i;
for (int i = len - 1; i >= len - cnt; i--)
if (f[i] != 'Z') return false;
return true;
}
这里参考了 Morbid 大佬的题解思路
那么这道题就可以用 string 解出来了
挂一份 AC 代码
bool canot() {
int len = f.size(), cnt = 0;
for (int i = len - 1; i >= 0; i--)
if (f[i] == 'Z') can[++cnt] = i;
for (int i = len - 1; i >= len - cnt; i--)
if (f[i] != 'Z') return false;
return true;
}
int main()
{
cin >> f;
if (!canot()) {
puts("-1");
return 0;
}
for (int i = 0; i <= f.size(); ++i) {
if (f[i] == 'Z') {
a += '0', b += '0';
}
if (f[i] == 'X') {
a += '1', b += '0';
}
if (f[i] == 'Y') {
a += '0', b += '1';
}
}
cout << a << endl << b;
这份代码防作弊而加了一点小操作,需要读者自己思考变量的定义。
提示:注意 can 字符串的定义。