过了 P5043,然后这个题 WA 了
写的是 OI-wiki 上更新过的树哈希
不是说这个卡不了吗……还是我写锅了
#include <cstdio>
#include <chrono>
#include <algorithm>
using namespace std;
const unsigned long long mask = std::chrono::steady_clock::now().time_since_epoch().count();
struct T{int v, t;}e[200050];
int T, n, c, z[2], p[100050], s[100050], h[100050];
unsigned long long f[100050], a[2], b[2];
unsigned long long g(unsigned long long x)
{
x ^= mask;
x ^= x << 13;
x ^= x >> 7;
x ^= x << 17;
x ^= mask;
return x;
}
void A(int u, int v) {e[++c] = {v, h[u]};h[u] = c;}
void X(int u, int k)
{
s[u] = 1;p[u] = 0;for(int i = h[u], v;i;i = e[i].t)
if((v = e[i].v) != k) X(v, u), s[u] += s[v], p[u] = max(p[u], s[v]);
if((p[u] = max(p[u], n - s[u])) <= n >> 1) z[z[0] != 0] = u;
}
void Y(int u, int k)
{
f[u] = 1;for(int i = h[u], v;i;i = e[i].t)
if((v = e[i].v) != k) Y(v, u), f[u] += g(f[v]);
}
int main()
{
scanf("%d", &T);while(T--)
{
scanf("%d", &n);for(int i = 1, u, v;i < n;++i) scanf("%d%d", &u, &v), A(u, v), A(v, u);
X(1, n);z[1] = z[z[1] != 0];Y(z[0], 0);a[0] = f[z[0]];Y(z[1], 0);a[1] = f[z[1]];
for(int i = 1;i <= n;++i) h[i] = 0;c = z[0] = z[1] = 0;
for(int i = 1, u, v;i < n;++i) scanf("%d%d", &u, &v), A(u, v), A(v, u);
X(1, n);z[1] = z[z[1] != 0];Y(z[0], 0);b[0] = f[z[0]];Y(z[1], 0);b[1] = f[z[1]];
puts(a[0] == b[0] && a[1] == b[1] || a[0] == b[1] && a[1] == b[0] ? "YES" : "NO");
for(int i = 1;i <= n;++i) h[i] = 0;c = z[0] = z[1] = 0;
}
return 0;
}