这道题在月赛的时候我本来是想用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字符串的定义。