首页 > 其他分享 >CodeForces-1671E Preorder

CodeForces-1671E Preorder

时间:2022-08-19 23:55:06浏览次数:100  
标签:Preorder 子树 相同 rson 1671E CodeForces lson ans dp

Preorder

树型 dp + 思维

\(dp[i]\) 表示以 \(i\) 为根的子树通过变换有多少种不同的先序遍历

状态转移方程:

  • 当左右子树不同,两个子树交换位置之后,没有重复的出现:\(dp[x] = dp[lson] * dp[rson] * 2\)

  • 当左右子树相同时,两个子树交换位置后,会有相同的出现:\(dp[x] = dp[lson] * dp[rson]\)

这里的相同并不是指原来的两个子树相同,而是指经过任意变换之后,两个子树存在相同的情况

如果存在相同的情况,说明其中一个子树的任意形态,另一个子树必然也有

接下来就考虑如何判断两个完全二叉树是否相同,最简单的就是对树进行排序后判断是否相同,看看代码就好了

时间复杂度应该是 \(O(nlogn)\)

#include <iostream>
#include <string>
using namespace std;
typedef long long ll;
const int maxn = 1 << 18 | 1;
const ll mod = 998244353;
int n;
string h[maxn], s;
ll ans[maxn];

void dfs(int now, int d)
{
    int x = now - 1;
    if(d == n)
    {
        h[now] = s[x];
        ans[now] = 1;
        return;
    }
    int lson = now << 1, rson = now << 1 | 1;
    dfs(lson, d + 1);
    dfs(rson, d + 1);
    if(h[lson] > h[rson]) swap(h[lson], h[rson]);
    h[now] = s[x] + h[lson] + h[rson];
    if(h[lson] == h[rson])
        ans[now] = ans[rson] * ans[lson] % mod;
    else
        ans[now] = ans[rson] * ans[lson] * 2 % mod;
}

int main()
{
    cin >> n >> s;
    dfs(1, 1);
    cout << ans[1] << endl;
    return 0;
}

标签:Preorder,子树,相同,rson,1671E,CodeForces,lson,ans,dp
From: https://www.cnblogs.com/dgsvygd/p/16606936.html

相关文章

  • Codeforces #815 Div.2
    A—BurenkaPlayswithFractions思路:数论O(1)见题解题解:#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;typedeflonglongL......
  • Educational Codeforces Round 117 (Rated for Div. 2) CF1612
    https://codeforces.com/contest/1612VP过了A~E,感觉海星。F,G这几天补。主要是luogu有翻译拯救了英语不好的我。A一眼\(x+y\equiv0\pmod{2}\),否则无解。那么显......
  • Educational Codeforces Round 33 (Rated for Div. 2) 虚拟赛体验
    前言就只做出了\(A,B,C,D\)是不是很弱?A.ChessForThreeA,B,C三人下棋,A和B先下,每次下完棋之后由现在观战的人(例如第一局就由C)代替下输的人。每次输入一个数表示谁赢......
  • Codeforces Round #815 (Div. 2) 全解
    目录ABCD1D2EAad和cb,查看是不是相等或者倍数关系,特判0Bsort()cout<<a[n]+a[n-1]-a[1]-a[2]C查看所有的四方格一个四方格有2个0,ans=1的个数一个四方格有1个0,ans=1......
  • Codeforces Round #815 (Div. 2) (补题中)
    战绩:  打到一半被叫走,回来后断断续续打完的。。。A.BurenkaPlayswithFractions刚开始感觉被trick绕进去了,思路有点乱,就先去切B了。实际上如果要a/b=c/d,我们只......
  • Codeforces Round #815 (Div. 2) 【A~C】
    A.BurenkaPlayswithFractions题目描述Burenkacametokindergarden.Thiskindergartenisquitestrange,soeachkidtherereceivestwofractions($\frac{a}......
  • codeforces526D. Om Nom and Necklace【KMP】
    飞刀可能进不了前百,但加上小李就能进前三忙完入学的各种事终于赶去图书馆时,在校内一天只吃了一个面包和巧克力,已是二十点四十。武大规定二十二点半闭馆,我满心期待在两个......
  • Codeforces Round #814 (Div. 2)(补题中)
    战绩:  有铁头娃A.ChipGame猜了个结论,第一次猜的是n==m,第二次猜的是n+m的奇偶性。严格证明也比较简单。由于只能向右向上,我们每次移动相当于缩减问题规模。那么......
  • CodeForces-1469C Building a Fence
    BuildingaFencedp模拟?维护好可摆放的区间即可,我用的区间是指当前位置可摆放的东西的下边界区间下限:\(l_i=max(l_{i+1}-k,h_i)\),表示尽量往下放,以及在地面之上......
  • 144.binary-tree-preorder-traversal 二叉树的前序遍历
    前序遍历即中左右,前中后序遍历区别就在于中节点是在前、中还是后。利用栈实现二叉树的迭代遍历:#include<stack>#include<vector>usingstd::stack;usingstd::vecto......