萌新求调树哈希
查看原帖
萌新求调树哈希
388651
5k_sync_closer楼主2023/5/31 08:19

过了 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;
}
2023/5/31 08:19
加载中...