思路:当这棵树有两个子树时,ans=dfs(l[root])*(r[root]);
当这棵树有一个子树时,ans=dfs(child[root])<<1;
当这棵树没有子树时,ans=1;
递归即可。
但是这里我写的时候一不小心写错了一个问题,就是第一种情况应该是乘而非加。。
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
typedef short hd;
hd qpos[27],hpos[27];
char qm[28],hb[28];
int dfs(hd ql,hd qr,hd hl,hd hr){
if(ql==qr)
return 1;
if(qm[ql+1]==hb[hr-1])return dfs(ql+1,qr,hl,hr-1)<<1;
return dfs(ql+1,hpos[hr-1]-1,hl,qpos[ql+1])*dfs(hpos[hr-1],qr,qpos[ql]+1,hr-1);
}
int main(){
scanf("%s%s",qm,hb);
hd ql=strlen(qm);
for(hd i=0;i<ql;++i)
for(hd j=0;j<ql;++j)
if(hb[j]==qm[i]){
qpos[i]=j,hpos[j]=i;
break;
}
printf("%d\n",dfs(0,ql-1,0,ql-1));
}
小浩浩还提供了一种更简洁更优秀的思路:
其ans若是增加,必是因为其出现了仅有一棵子树的情况(<<1),所以我们只要统计只有一棵子树的节点个数n,输出2<<n即可。