• Educational Codeforces Round 127 (Rated for Div. 2) E. Preorder


    \(f[v]\)是以结点\(v\)为根的方案数,设左子树的根为\(x\),右子树的根为\(y\),那么如果左右子树完全相同,那么我们交换左右子树对方案没有任何影响,都是:

    \[f[v] = f[x] * f[y] \]

    如果左右子树不相同,那么则多出\(f[x] * f[y]\)的贡献,所以方案数为\(f[v] = f[x] * f[y] * 2\)

    最重要的就是如何判断两个子树是不是完全相同的,这里用到树哈希,参考大佬们的哈希函数:

    \[Hash[u] = Hash[x] * Hash[y] + P_{(0:s[u] = A \, 1:s[u] = B)}^{depth} \]

    其中\(P_0\)\(P_1\)是两个不同的质数,因为对哈希基本没有研究,所以我直接取了131,1331,幸运没有被卡。

    #include <bits/stdc++.h>
    
    using namespace std;
    
    using ll = long long;
    using ull = unsigned long long;
    const int N = (1 << 18) + 10, Mod = 998244353;
    ull P1 = 131, P0 = 13131;
    ull Hash[N];
    ll n;
    ll f[N];
    ull pre1[25], pre0[25];
    string s;
    
    void dfs(ll u, ll depth) {
        if (u * 2 >= ((1 << n) - 1)) { //到了叶子结点
            f[u] = 1;
            Hash[u] = ((s[u] - 'A') ? pre1[depth] : pre0[depth]);
            return;
        }
    
        dfs(u * 2ll, depth + 1);
        dfs(u * 2ll + 1, depth + 1);
    
        Hash[u] = Hash[u << 1] * Hash[u << 1 | 1] + ((s[u] - 'A') ? pre1[depth] : pre0[depth]);
        
        f[u] = f[u << 1] * f[u << 1 | 1] % Mod;
        if (Hash[u << 1] != Hash[u << 1 | 1]) {
            f[u] = f[u << 1] * f[u << 1 | 1] % Mod * 2 % Mod;
        }
    }
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin.tie(0);
        pre1[1] = P1;
        for (int i = 2; i <= 20; i++) {
            pre1[i] = pre1[i - 1] * P1;
        }
        pre0[1] = P0;
        for (int i = 2; i <= 20; i++) {
            pre0[i] = pre0[i - 1] * P0;
        }
        
        cin >> n;
        cin >> s;
        s = "0" + s;
    
        dfs(1, 1);
    
        //cout << Hash[4] << " " << Hash[5] << "\n";
        cout << f[1] << "\n";
    
        return 0;
    }
    
  • 相关阅读:
    poj 3261 Milk Patterns
    poj 3292 Semi-prime H-numbers
    bzoj千题计划256:bzoj2194: 快速傅立叶之二
    bzoj千题计划255:bzoj3572: [Hnoi2014]世界树
    bzoj千题计划254:bzoj2286: [Sdoi2011]消耗战
    bzoj千题计划253:bzoj2154: Crash的数字表格
    扩展BSGS算法
    bzoj千题计划252:bzoj1095: [ZJOI2007]Hide 捉迷藏
    bzoj千题计划251:bzoj3672: [Noi2014]购票
    bzoj千题计划250:bzoj3670: [Noi2014]动物园
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/16204078.html
Copyright © 2020-2023  润新知