这题先分别建树,再先序遍历。
值得注意的是,可能会有这样的数据:
e
f
或者
f
pffee
之类的。
我是用的指针:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
#include <set>
#include <stack>
#include <queue>
using namespace std;
#define N 30000
#define Dbag printf("haha\n");
char s1[N], s2[N];
int sum, pos;
struct node
{
char v;
node *child[4];
};
void newroot(node *root) //初始化每个节点
{
root->v=0;
for(int i = 0; i < 4; i++)
root->child[i]=NULL;
}
node* build(node *root, char *s)
{
++pos; //pos表示当前字串中的位置
if(s[pos]=='\0')
return NULL;
root = new node; //建立
newroot(root); // 初始化
root->v = s[pos]; //赋节点的值
if(s[pos]=='p')
{
for(int i = 0; i < 4; i++)
{
if(root->child[i]==NULL)
root->child[i] = build(root->child[i], s);
}
}
return root;
}
void preorder(node *root1, node *root2, int deep)
{
if(root1==NULL&&root2==NULL) //两个都为空,返回
return ;
if(root1==NULL) //其中一个为空
{
if(root2->v=='f') //另一个为f,不用再向下递归
{
sum+=1024>>(deep*2); //加上权值,返回
return ;
}
for(int i = 0; i < 4; i++) //否则向下递归
{
preorder(root1, root2->child[i], deep+1);
}
return ;
}
if(root2==NULL) //同上
{
if(root1->v=='f')
{
sum+=1024>>(deep*2);
return ;
}
for(int i = 0; i < 4; i++)
{
preorder(root1->child[i], root2, deep+1);
}
return ;
}
if(root1->v=='f'||root2->v=='f') //1和2其中一个为f,加上权值,返回
{
sum+=1024>>(deep*2);
return ;
}
for(int i = 0; i < 4; i++) //1和2都不为空,且都不为f,向下递归继续找
preorder(root1->child[i], root2->child[i], deep+1);
}
void solve()
{
sum = 0;
node *root1 = new node;
node *root2 = new node;
newroot(root1); newroot(root2);
pos=-1;
root1 = build(root1, s1);
pos=-1;
root2 = build(root2, s2);
preorder(root1, root2, 0);
printf("There are %d black pixels.\n", sum);
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%s%s", s1, s2);
solve();
}
return 0;
}