时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond
abc
cba
4
如描述
题解: 二叉树的遍历我简直烂的要死。这个是属于需要单独搞的内容。
先序遍历:先根节点,再左子树,再右子树。 中序遍历:先左子树,再根节点,再右子树。 后序遍历:先左子树,再右子树,再根节点。
如果已知先序和中序,则后序唯一确定。 如果已知后序和中序,则先序唯一确定。 但如果已知先序和后序,则中序不一定。
考虑什么样的节点会有不同的中序遍历的值? 如果一个节点只有一个子树,那么这个节点就有两个中序遍历可以满足给出的先序和后序。
那么如何确定只有一个子树的节点? 有个性质,一个节点和它唯一的子树在前序和后序遍历出现的位置刚好相反。所以我们只要找到有多少个符合这个结构的点,就可以找到有多少个节点只有一个子树。 【其实我不是太懂,大概感性理解了下,有时间再补补二叉树和遍历
最后的答案就是n^2
code:
//遍历问题 #include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const int N = 50; char s1[N],s2[N]; int sum=0; ll ans; int main(){ scanf("%s",s1);scanf("%s",s2); for(register int i=1;i<strlen(s1);i++){ for(register int j=1;j<strlen(s2);j++){ if(s1[i-1]==s2[j]&&s1[i]==s2[j-1]) sum++; } } ans=1<<sum; printf("%lld\n",ans); return 0; }