76分求助
查看原帖
76分求助
315205
Kniqht楼主2022/9/13 18:57

树哈希,顺便问一下还有没有人用树哈希也得过76,给点经验?谢谢!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<utility>
#include<queue>
#include<map>
#define lc tr[x][0]
#define rc tr[x][1]
#define ull unsigned long long
using namespace std;
const int N=1e6+10;
const ull M=4508375473295257248,M1=412037123471,X[2]={1423841,2484533};
int n,tr[N][2],f[N],ans;
ull w[N],h1[N],h2[N],h3[N];
void dfs(int x,int depth,int now){
    f[x]=1;
    h1[x]=w[x]*((ull)depth+M1)*M1;
    h2[x]=w[x]*X[1-now];h3[x]=w[x]*X[now];
    for(int i=0;i<2;i++){
        int j=tr[x][i];
        if(j==-1) continue; 
        dfs(j,depth+1,i);
        f[x]+=f[j];
    }
    if(lc!=-1&&rc!=-1&&h1[lc]==h1[rc]&&h2[lc]==h3[rc]) ans=max(ans,f[x]);
    if(lc!=-1) h1[x]+=h1[lc],h2[x]+=h2[lc],h3[x]+=h3[lc];
    if(rc!=-1) h1[x]+=h1[rc],h2[x]+=h2[rc],h3[x]+=h3[rc];
    h1[x]*=M;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) cin>>w[i];
    for(int i=1;i<=n;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        tr[i][0]=x;tr[i][1]=y;
    }
    ans=1;
    dfs(1,1,1);
    printf("%d",ans);
    return 0;
}

2022/9/13 18:57
加载中...