有解时当且仅当满足以下条件:

  • pc 的数量相等

    当不相等时,显然无法回到同一层,故此时无解。

  • 在最小深度层上,要么同时存在 l 操作和 r 操作,要么两者都不存在。

    • 若只存在其中一种操作,显然无法回到同一棵子树上,因此无解。然后由于向左和向右的移动距离都是任意的,因此只要两种操作均存在,即可构造出一种方案使得能够回到原结点上,而不需要 l 操作数量与 r 相等。
    • 至于其它层,可以通过跨层操作来消除移动的影响,如 lpc 通过先到父结点再返回同层的一个兄弟结点来消除 l 操作的影响。

因此得到如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void solve ()
{
scanf ("%s",s + 1);
int n = strlen (s + 1),V = 1e5,Base = V,mn = Base;
vector <bool> L (2 * V + 1),R (2 * V + 1);
for (int i = 1;i <= n;++i)
{
if (s[i] == 'c') ++Base;
if (s[i] == 'p') --Base,mn = min (mn,Base);
if (s[i] == 'l') L[Base] = 1;
if (s[i] == 'r') R[Base] = 1;
}
if (Base != V || L[mn] != R[mn]) puts ("No");
else puts ("Yes");
}