WA 90分(WA #9)蒟蒻的我实在是调不出来了
查看原帖
WA 90分(WA #9)蒟蒻的我实在是调不出来了
544525
xiaoming123321楼主2021/8/12 20:18
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll unsigned long long
#define base 2333
#define MOD 1000000007
#define write(n) n < 0 ? putchar('-'), rite(-n) : rite(n)
using namespace std;
inline int read() {
    register int x = 0, b = 1;
    register char c = getchar();
    while (c < '0' || c > '9') {
        if (c == '-') b = 0;
        c = getchar();
    }
    while (c >= '0' && c <= '9') {
        x = (x << 3) + (x << 1) + (c ^ '0');
        c = getchar();
    }
    return b ? x : -x;
}
void rite(int n) {
    if (n > 9) rite(n / 10);
    putchar(n % 10 ^ '0');
}
int num, first[52], ne[102], to[102], sz[52], d[52], maxx, root[4];
ll ha[52];
inline void add(register const int &a, register const int &b) {
    ne[++num] = first[a],
    first[a] = num,
    to[num] = b;
}
ll hash(int u, int father) {
    ll res = 1001, buf[52];
    int now = 0;
    for (int i = first[u]; i; i = ne[i]) {
        if (to[i] != father) {
            buf[++now] = hash(to[i], u);
        }
    }
    sort(buf + 1, buf + now + 1);
    for (int i = 1; i <= now; ++i ) {
        res = (res * base ^ buf[i]) % MOD;
    }
    return res;
}
void dfs(int x, int fa, const int &n) {
    sz[x] = 1;
    int res = 0;
    for (int i = first[x]; i; i = ne[i]) {
        if (to[i] != fa) {
            dfs(to[i], x, n);
            sz[x] += sz[to[i]];
            res = max(res, sz[to[i]]);
        }
    }
    res = max(res, n - sz[x]);
    d[x] = res;
    maxx = min(maxx, res);
}
int main() {
    int m = read();
    memset(ha, 0x7fffffff, sizeof(ha));
    for (register int n, i = 1; i <= m; ++i) {
        memset(first, 0, sizeof(first));
        n = read();
        int tot = num = 0;
        for (register int x,j = 1; j <= n; ++j) {
            x = read();
            if (x) add(j, x), add(x, j);
        }
        maxx = 0x7fffffff/3;
        dfs(1, 0, n);
        for (int j = 1; j <= n; ++j) {
            if (d[j] == maxx) {
                root[++tot] = j;
            }
        }
        for (int j = 1; j <= tot; ++j) {
            ha[i] = min(ha[i], hash(root[j], 0));
        }
        for (int j = 1; j <= i; ++j) {
            if (ha[i] == ha[j]) {
                write(j);
                putchar('\n');
                break;
            }
        }
    }
    return 0;
}
2021/8/12 20:18
加载中...