对哈希做法的一个疑惑
查看原帖
对哈希做法的一个疑惑
482856
TigerNick楼主2023/7/21 17:10
#include <bits/stdc++.h>
#define int long long
#define MAXN 1000010
using namespace std;
int n,sz[MAXN],ans;
const int m[3]={1000000009976907,89999794200117649,89999794200117649},base[3]={1000000007,299999827,999999751};
struct tree
{
    int ls,rs,v;
    int h1[3],h2[3];
}T[MAXN];
void dfs(int x)
{
    int cnt=0;
    if(T[x].ls) dfs(T[x].ls),cnt++;
    if(T[x].rs) dfs(T[x].rs),cnt++;
    sz[x]=sz[T[x].ls]+sz[T[x].rs]+1;
    /*
    int a1=T[T[x].ls].h1;
    int a2=T[T[x].rs].h1;
    int a3=T[T[x].ls].h2;
    int a4=T[T[x].rs].h2;
    */
    for(int i=0;i<3;i++)
    {
        T[x].h1[i]=(((T[T[x].ls].h1[i]*base[i])%m[i]+T[x].v)*base[i]%m[i]+T[T[x].rs].h1[i])%m[i];
        T[x].h2[i]=(((T[T[x].rs].h2[i]*base[i])%m[i]+T[x].v)*base[i]%m[i]+T[T[x].ls].h2[i])%m[i];
    }
    bool flag=true;
    for(int i=0;i<3;i++)
        if(T[x].h1[i]!=T[x].h2[i])
        {
            flag=false;
            break;
        }
    if(sz[T[x].ls]!=sz[T[x].rs]) flag=false;
    if(flag) ans=max(ans,sz[x]);
}
signed main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>T[i].v;
    for(int i=1;i<=n;i++)
    {
        cin>>T[i].ls>>T[i].rs;
        if(T[i].ls==-1) T[i].ls=0;
        if(T[i].rs==-1) T[i].rs=0;
    }
    dfs(1);
    cout<<ans;
    return 0;
}

哈希做法,我开了三个模数和base,本来一直60pts,看了第一篇题解,把模数和base开的很大就AC了

不理解为什么不会溢出

2023/7/21 17:10
加载中...