我居然連這種遞歸不太會寫了
直接暴力ASCII值作爲下標開點233
注意0 0的情況
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <set>
#include <vector>
#include <cmath>
#define LL long long
#define eps 1e-8
const LL INF = 0x3f3f3f3f;
const int maxn = 2000 + 5;
using namespace std;
bool vis[maxn];
struct node{
char cur,l,r;
node(){}
node(char c, char ll, char rr):cur(c),l(ll),r(rr){}
}tree1[maxn],tree2[maxn];
bool solve(int rt1, int rt2){
if(rt1 == '-' && rt2 == '-') return true;
if(rt1 == '-' && rt2 != '-') return false;
if(rt1 != '-' && rt2 == '-') return false;
if(tree1[rt1].cur != tree2[rt2].cur) return false;
if(tree1[rt1].l == '-' && tree2[rt2].l == '-') return solve(tree1[rt1].r, tree2[rt2].r);
if(tree1[rt1].r == '-' && tree2[rt2].r == '-') return solve(tree1[rt1].l, tree2[rt2].l);
if(tree1[rt1].l == tree2[rt2].l && tree1[rt1].r == tree2[rt2].r)
return solve(tree1[rt1].l,tree2[rt2].l) && solve(tree1[rt1].r, tree2[rt2].r);
return solve(tree1[rt1].l, tree2[rt2].r) && solve(tree1[rt1].r ,tree2[rt2].l);
}
int main(){
int n,m;
int rt1 = 0, rt2 = 0;
scanf("%d",&n);
char x,y,z;
memset(vis, false, sizeof(vis));
for(int i=0; i<n; i++){
getchar();
scanf("%c %c %c",&x,&y,&z);
vis[y] = true;
vis[z] = true;
tree1[i+'0'] = node(x,y,z);
}
for(int i=0; i<n; i++){
if(!vis[i+'0']) {
rt1 = i+'0';
break;
}
}
memset(vis, false, sizeof(vis));
scanf("%d",&m);
for(int i=0; i<m; i++){
getchar();
scanf("%c %c %c",&x,&y,&z);
tree2[i+'0'] = node(x,y,z);
vis[y] = true;
vis[z] = true;
}
for(int i=0; i<m; i++){
if(!vis[i+'0']) {
rt2 = i+'0';
break;
}
}
if(n == 0 && m == 0) printf("Yes\n");
else if(solve(rt1,rt2)) printf("Yes\n");
else printf("No\n");
}