文章
1
粉丝
69
获赞
0
访问
5.5k
这道题实际上就是要获得每个结点的子结点数目。当获得子结点数目k之后,每个父结点带来C(m,k)种可能的子结点排序,最终将每个结点的子结点排序可能数相乘即可。
为求得每个结点的子结点数目,类似19年第一题,在s2后序遍历中找到对应s1先序遍历字符的位置,就得到一个数组。
如第四个用例,得到的数组应该为{11, 4, 3, 1, 2, 9, 5, 6, 7, 8, 10}。要找每个结点的字结点数,首先必须向右遍历,因为只有在其右边才可能为子结点,但在右边的还可能是兄弟结点,如何区别呢?如果为兄弟结点,则它在后序遍历中也依然在该结点的右边,若为子结点,则应该在该结点左边。
因此,只需找到每个结点右边既小于该结点,又比前一个被记录的兄弟结点大的数目,即为每个结点的子结点数。
如对11进行操作,得到4,9,10,记录为3;对4进行操作,得到3,记录为1……
最终得到{3, 1, 2, 0, 0, 4, 0, 0, 0, 0, 0}。
#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
using namespace std;
long long zuhe(int m,int n)
{
if (m<n-m) m=n-m;
long long ans = 1;
for (int i = m + 1; i <= n; i++) ans *= i;
for (int i = 1; i <= n - m; i++) ans /= i;
return ans;
}
int main()
{
int n,i,j,sum,temp;
long long ans;
string s,s1,s2;
while(scanf("%d ",&n)!=EOF)
{
ans=1;
cin >> s1 >> s2;
vector<int> a(s1.size());
...
登录后发布评论
暂无评论,来抢沙发