题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1832

题意: 中文题诶~

思路: 若二叉树中有 k 个节点只有一个子树, 则答案为 1 << k.

详情参见:http://blog.csdn.net/gyhguoge01234/article/details/77836484

代码:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#define ll long long
using namespace std; const int MAX = 1e2;
const int M = 1e9;//1e9为1节
const int MAXN = ; struct BigInt{
const static int mod = ;
const static int DLEN = ;
int a[], len;
BigInt(){
memset(a, , sizeof(a));
len = ;
}
BigInt(int v){
memset(a, , sizeof(a));
len = ;
do{
a[len++] = v % mod;
v /= mod;
}while(v);
}
BigInt(const char s[]){
memset(a, , sizeof(a));
int L = strlen(s);
len = L / DLEN;
if(L % DLEN) len++;
int index = ;
for(int i = L - ; i >= ; i -= DLEN){
int t = ;
int k = i - DLEN + ;
if(k < ) k = ;
for(int j = k; j <= i; j++)
t = t * + s[j] - '';
a[index++] = t;
}
}
BigInt operator +(const BigInt &b)const{
BigInt res;
res.len = max(len, b.len);
for(int i = ; i <= res.len; i++) res.a[i] = ;
for(int i = ; i < res.len; i++){
res.a[i] += ((i < len) ? a[i] : ) + ((i < b.len) ? b.a[i] : );
res.a[i + ] += res.a[i] / mod;
res.a[i] %= mod;
}
if(res.a[res.len] > ) res.len++;
return res;
}
BigInt operator *(const BigInt &b)const{
BigInt res;
for(int i = ; i < len; i++){
int up = ;
for(int j = ; j < b.len; j++){
int temp = a[i] * b.a[j] + res.a[ i + j] + up;
res.a[i + j] = temp%mod;
up = temp / mod;
}
if(up != )
res.a[i + b.len] = up;
}
res.len = len + b.len;
while(res.a[res.len - ] == && res.len > ) res.len--;
return res;
}
void output(){
printf("%d", a[len - ]);
for(int i = len - ; i >= ; i--)
printf("%04d", a[i]);
printf("\n");
}
}; // 先序遍历 X L … R …
// 后序遍历 … L … R X const int N = 1e5 + ;
int a[N], b[N];
BigInt sol(); void dfs(int al, int ar, int bl, int br){
if(ar - al <= ) return;
al++;
br--;
int indx = bl, cnt = ;;
while(a[al] != b[indx]) indx++;
int newar = al + (indx - bl + );
int newbr = indx + ;
cnt++;
dfs(al, newar, bl, newbr);
if(ar - al != indx - bl + ){
cnt++;
dfs(newar, ar, newbr, br);
}
if(cnt == ) sol = sol * ;
} int main(void){
int n;
scanf("%d", &n);
for(int i = ; i < n; i++){
scanf("%d", &a[i]);
}
for(int i = ; i < n; i++){
scanf("%d", &b[i]);
}
sol = ;
dfs(, n, , n);
sol.output();
return ;
}

最新文章

  1. PHP语法(三):控制结构(For循环/If/Switch/While)
  2. remove name=&quot;ProxyModule“会导致重复执行
  3. 使用Astah制作UML时序图
  4. java 字符串类型String
  5. html textarea 获取换行
  6. JS获取上传文件的绝对路径,兼容IE和FF
  7. 1-3 ISO/OSI七层模型详解
  8. QT线程(二)---线程同步
  9. Eclipse下使用Hadoop单机模式调试MapReduce程序
  10. 未能解析目标框架“.NETFramework,Version=v4.0”的 mscorlib 错误的解决办法
  11. LoadRunner录制回放脚本RecContentType=application/json报错
  12. 关于close和shutdown
  13. C语言如何输出%
  14. 网站 Cookie only 唯一 防止被截获
  15. maven项目自动创建src/main/resources等四个资源文件夹
  16. JS获取元素的宽高以及offsetTop,offsetLeft等的属性值
  17. spring boot 返回json字符串 null值转空字符串
  18. 台式电脑、笔记本快捷选择启动项Boot 快捷键大全
  19. 为什么要用redis
  20. python操作数据库PostgreSQL

热门文章

  1. python&#39;s ninteenth day for me 类的组合,继承。
  2. Python之二维数组N*N顺时针旋转90度
  3. HttpURLConnection连接网页和获取数据的使用实例
  4. Objects &amp; Class
  5. sql2012增加Sequence对象
  6. java基础之JDBC三:简单工具类的提取及应用
  7. 【bzoj1015】星球大战starwar
  8. YII2 模型关联之 一对多
  9. java代码优化29个点
  10. c++策略模式(Strategy Method)