社区讨论

树哈希WA on #9求助

P5043【模板】树同构 / [BJOI2015] 树的同构参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lronkyxz
此快照首次捕获于
2024/01/22 16:16
2 年前
此快照最后确认于
2024/01/22 19:28
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
#define maxn 5010
#define SEED 2333
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
struct EDGE{
    int nxt, to;
}e[maxn << 1];
int head[maxn], cnt, n, T , maxs[maxn];
ll ans[maxn], minsiz, siz[maxn];
inline void add(int a,int b){e[++cnt].nxt = head[a], e[cnt].to = b, head[a] = cnt;}
inline void dfs(int u,int fa){
    ll maxsiz = 0; siz[u] = 1; 
    for(int i = head[u]; i;i = e[i].nxt){
        int to = e[i].to; if(to == fa) continue;
        dfs(to, u);
        siz[u] += siz[to];
        maxsiz = max(maxsiz, siz[to]);
    }
    maxsiz = max(maxsiz, n - siz[u]); maxs[u] = maxsiz;
    minsiz = min(minsiz, maxsiz);
}

inline ll solve(int u,int fa){
    ll s[maxn], top = 0, sum = SEED;
    for(int i = head[u]; i; i = e[i].nxt){
        int to = e[i].to; if(to == fa) continue;
        s[++top] = solve(to, u);
    }
    sort(s + 1, s + 1 + top);
    for(int i = 1; i <= top; i++) sum = ((sum * SEED) ^ s[i]) % mod;
    return sum;
}

int rt[maxn], tot;
int main(){
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    cin >> T;
    for(int i = 1; i <= maxn - 1; i++) ans[i] = LONG_LONG_MAX;
    for(int t = 1; t <= T; t++){
        cin >> n; minsiz = LONG_LONG_MAX, cnt = 0, tot = 0;
        memset(head, 0, sizeof head);
        for(int i = 1, u; i <= n; i++) {cin >> u; if(u != 0) add(u, i), add(i, u);}
        dfs(1, 0);
        for(int i = 1; i <= n; i++) if(minsiz == maxs[i]) rt[++tot] = i;
        for(int i = 1; i <= tot; i++) ans[t] = min(ans[t], solve(rt[i], 0));
        for(int i = 1; i <= t; i++) if(ans[i] == ans[t]) {cout << i << '\n'; break;}
    }
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...