• [NOIP2018PJ]对称二叉树


    [NOIP2018PJ]对称二叉树

    这个题正常人看到题面难道不是哈希?
    乱写了个树哈希...

    #include<bits/stdc++.h>
    using namespace std;
    const int _=1e6+5,p=998244353;
    int re(){
        int x=0,w=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
        return x*w;
    }
    int n,ans=1,w[_],ls[_],rs[_],sz[_],f[_],g[_],h[_];
    void init(int u){
        sz[u]=1;
        if(ls[u]>0){init(ls[u]);sz[u]+=sz[ls[u]];h[u]++;}
        if(rs[u]>0){init(rs[u]);sz[u]+=sz[rs[u]];h[u]++;}
    }
    void calc(int u){
        f[u]=w[u]*233+sz[u]*(19+h[u]);
        if(ls[u]>0){
            calc(ls[u]);
            f[u]=1ll*f[u]*17%p+f[ls[u]]%p;
        }
        if(rs[u]>0){
            calc(rs[u]);
            f[u]=1ll*f[u]*f[u]%p+f[rs[u]]%p;
        }
    }
    void dfs(int u){
        if(ls[u]>0)dfs(ls[u]);
        if(rs[u]>0)dfs(rs[u]);
        swap(ls[u],rs[u]);
    }
    int main(){
        n=re();
        for(int i=1;i<=n;i++)w[i]=re();
        for(int i=1;i<=n;i++)
            ls[i]=re(),rs[i]=re();
        init(1);calc(1);
        for(int i=1;i<=n;i++)g[i]=f[i];
        dfs(1);calc(1);
        for(int i=1;i<=n;i++)
            if(f[i]==g[i])ans=max(ans,sz[i]);
        printf("%d
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    项目经验【1】
    cudagdb
    外国名著小说大全
    历史天气查询
    名著小说在线阅读
    NET里ListView只启用竖向Veritcal滚动条Scrollbar(C#)
    XML 中特殊字符转换
    panle 闪烁 通过windowsApi
    selenium的Select下拉框选择
    浅浅的聊一下 WebSocket
  • 原文地址:https://www.cnblogs.com/sdzwyq/p/10031895.html
Copyright © 2020-2023  润新知