记$dep(T)$为树$T$的深度(根节点深度为0),则有$egin{cases}dep(A+B)=max(dep(A),dep(B))\dep(Acdot B)=dep(A)+dep(B)end{cases}$
考虑$C$中最深的点,对其来源于$AX$还是$BY$分类讨论(不妨假设是前者),再取出其深度为$dep(A)$的祖先,那么$X$即只能取该祖先的子树
确定$X$后,求出$AX$并在$C$中去掉,再类似地求出$Y$并判定即可
过程中需要实现一个树同构的判定,简单哈希即可
时间复杂度为$o(nlog n)$,可以通过
(实现可能略微有一些繁琐,由于无法提交并不保证代码正确,仅供参考)

1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 100005 4 #define mod 998244353 5 #define ll long long 6 int t,num[11],seed[N]; 7 map<int,vector<int> >mat; 8 map<int,vector<int> >::iterator it; 9 int read(){ 10 int x=0; 11 char c=getchar(); 12 while ((c<'0')||(c>'9'))c=getchar(); 13 while ((c>='0')&&(c<='9')){ 14 x=x*10+c-'0'; 15 c=getchar(); 16 } 17 return x; 18 } 19 void write(int x,char c='