题意
X 和 Y 各有一个权值 $v_x, v_y$.
现在从最低位开始依次比较。
比如 $v_x=37$,$v_y=28$:
- 首先比较最后一位,$(7,8)$,Y 暂时领先。
- 再加上前一位,$(37,28)$,X 暂时领先。
- 比较结束。
如果我们用 X
代表小 X 暂时领先,Y
代表小 Y 暂时领先,那么可以写下一个字符串 XY
。
再比如,$v_x=137$,$v_y=47$。
如果我们再用 Z
表示小 X 与小 Y 的点赞数暂时一样,那么写下的字符串应该为 XYZ
。
给定最后的字符串 $s_i$,请构造一种可能的 $(v_x v_y)$。
若不存在构造方案,输出 $-1$.
为了方便输出,用前导零补足位数。
对于 $100\%$ 的数据,$s_i \in \{\texttt{X},\texttt{Y},\texttt{Z}\}$,$1 \le \text{len}(s) \le 10^6$。
XY
37
28
XYZ
137
047
ZZZZZZ
000000
000000
XYZXYZ
-1
题解
如果 $Z$ 不是连续的后缀,则无解。
否则用 $0/1$ 构造即可。
const int MAXN = 1e6 + 10;
string s;
int a[MAXN], b[MAXN];
int main() {
cin >> s;
int n = s.length(), flag = 0;
for(int i = 0; i < n; i++) {
if(flag && s[i] != 'Z') {
cout << -1 << endl;
return 0;
}
if(s[i] == 'X') a[i] = 1, b[i] = 0;
else if(s[i] == 'Y') a[i] = 0, b[i] = 1;
else if(s[i] == 'Z') flag = 1;
}
for(int i = 0; i < n; i++) cout << a[i]; cout << endl;
for(int i = 0; i < n; i++) cout << b[i]; cout << endl;
return 0;
}