申请发P1229的题解
  • 板块工单反馈版
  • 楼主Mercury_C
  • 当前回复8
  • 已保存回复8
  • 发布时间2022/4/14 21:52
  • 上次更新2023/10/28 03:44:24
查看原帖
申请发P1229的题解
565018
Mercury_C楼主2022/4/14 21:52

在已有的题解中,没有十分详细的剖析为什么是i=0且j=1 的情况的,而我写了一个,也普及了位运算,以下是题解。

关于本题的补充的点

这个题的解题思路就是找到子节点只有一个的结点,由于排列组合的原理我们能轻松的得出此题的答案就是2的x次方,其中x为子结点只有一个的点。

而子结点只有一个的点该怎么去找呢,很简单,就是比如说BA和AB吧,我们先定位A然后去定位B的位置,由于A只有一个子结点,那么不会有另一个来碍事(不然的话就不是AB了而是别的,因为后序的话有左有右不可能先输出中间的满结点)

如果不理解可以写一个模拟一下,比如

pre:1245637

post:7326541

这个二叉树就有两个子结点只有一个的结点

那么不难得出代码

if(pre[i]==post[j]&&pre[i+1]==post[j-1])
   ans++;

那么我说的难懂的地方究竟在哪里呢?

先上代码,其中l为字符串的长度。

    for(int i=0;i<l;i++)
        for(int j=1;j<l;j++)

为什么j=1?而i=0?为什么不能写成i=0而j=0或者i=1且j=0

1.我们先来说i=0且j=0:

首先我们讨论一个二叉树

在这个二叉树中我们不难写出其pre为ACDEB 其post为BEDCA

如果我们按照i=0&&j=0的思路来做的话,会发现虽然根结点为满,但是符合pre为AC post为CA的情况,显然与事实不符,故而肯定不对。

2.为什么i=1且j=0不对?

显然我们知道post的最后一个为根结点,pre第一个为根结点,如果要是写成这样的话,乍一看似乎就算了一次根结点应该没有问题,而事实上我们忽略了一种情况,而这样的情况呢,如下图所示。

显然,这样的二叉树也存在,并且也有子结点为一个的点,而我们跑了代码之后呢? 完了,答案为0! 为什么会这样?

答案就是!我们把pre中的根结点压根没进行计算(i=1),就会出现pre中没有A的情况,那么还哪来的AB和BA呢?

这样的话,你就会爆两个点,拿到80pts的高分

80pts(i=1且j=0)

最后呢再说一个知识点叫位运算,这个题用pow不太好,所以我们结合计算机二进制的特性,搞了个位运算,目前初学者只用记住(1<<x)=2^x就行,而详细的内容则可以自己查询。

附AC代码

#include<iostream>
using namespace std;
string pre,post;
int ans;
int main()
{
    cin>>pre>>post;
    int l=pre.length();
    for(int i=0;i<l;i++)
        for(int j=1;j<l;j++)
        if(pre[i]==post[j]&&pre[i+1]==post[j-1])
            ans++;
    cout<< ( 1 << ans)<<endl;
    return 0;
}

``
2022/4/14 21:52
加载中...