文章

1

粉丝

69

获赞

0

访问

5.1k

头像
和19年第一题非常类似的一道题目
推荐阅读
P1283 上海交通大学机试题
发布于2022年3月19日 12:49
阅读数 5.1k

这道题实际上就是要获得每个结点的子结点数目。当获得子结点数目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());
...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发