P10388 [蓝桥杯 2024 省 A] 团建题目描述小蓝正在和朋友们团建有一个游戏项目需要两人合作两个人分别拿到一棵大小为nnn和mmm的树树上的每个结点上有一个正整数权值。两个人需要从各自树的根结点111出发走向某个叶结点从根到这个叶结点的路径上经过的所有结点上的权值构成了一个正整数序列两人的序列的最长公共前缀即为他们的得分。给出两棵树请计算两个人最多的得分是多少。输入格式输入的第一行包含两个正整数 $n, m $用一个空格分隔。第二行包含nnn个正整数 $c_1, c_2,\cdots , c_n $相邻整数之间使用一个空格分隔其中cic_ici表示第一棵树结点iii上的权值。第三行包含mmm个正整数d1,d2,⋯ ,dmd_1, d_2,\cdots, d_md1,d2,⋯,dm相邻整数之间使用一个空格分隔其中did_idi表示第二棵树结点iii上的权值。接下来n−1n - 1n−1行每行包含两个正整数ui,viu_i , v_iui,vi表示第一棵树中包含一条uiu_iui和viv_ivi之间的边。接下来m−1m - 1m−1行每行包含两个正整数pi,qip_i , q_ipi,qi表示第二棵树中包含一条pip_ipi和qiq_iqi之间的边。输出格式输出一行包含一个整数表示答案。输入输出样例 #1输入 #12 2 10 20 10 30 1 2 2 1输出 #11输入输出样例 #2输入 #25 4 10 20 30 40 50 10 40 20 30 1 2 1 3 2 4 3 5 1 2 1 3 3 4输出 #22说明/提示对于20%20\%20%的评测用例$1 ≤ n, m ≤ 500 $对于所有评测用例$1 ≤ n, m ≤ 2 × 10^51 ≤ c_i, d_i ≤ 10^8 1 ≤ u_i, v_i ≤ n 1 ≤ p_i, q_i ≤ m $对于任意结点其儿子结点的权重互不相同。C实现#includebits/stdc.h#defineintlonglongusingnamespacestd;intc[200005],d[200005];unordered_mapint,inttrie[200005];vectorintG[200005],T[200005];voidinit(intx1,intfa0){for(autov:G[x]){if(vfa)continue;trie[x][c[v]]v;init(v,x);}}intsolve(intx1,intfa0,intget1){intans0;for(autov:T[x]){if(vfa)continue;if(trie[get][d[v]])ansmax(ans,solve(v,x,trie[get][d[v]])1);}returnans;}signedmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);intn,m,u,v;cinnm;for(inti1;in;i)cinc[i];for(inti1;im;i)cind[i];for(inti1;in;i){cinuv;G[u].push_back(v);G[v].push_back(u);}for(inti1;im;i){cinuv;T[u].push_back(v);T[v].push_back(u);}init();if(c[1]d[1])coutsolve()1;elsecout0;return0;}后续接下来我会不断用C来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现记录日常的编程生活、比赛心得感兴趣的请关注我后续将继续分享相关内容