今天已经把题目全部写完了。 就做一下题解来,当复习吧。今天做了一道题。我觉得比较有意思。题目如下。
这题很有意思。主要是要求的是中序。 题目也告诉我们。中序是不固定的。 其实如果仔细观察题目所给的条件,你会发现这个样例其实给了你一点提示。例子给出的是三个元素。 但我们却知道这三个元素。组成的树林 深度为三。 为什么? 可以观察一下。 按前序的要求。 根的后面 是左右子树,。而在后序中,根的前面是左右子树。由此不管是前序和后序 子树的左右是不会变的。 但是在 例子中变了。这就说明他们不是左右 子树关系。 而是根 和子节点的关系。 而且他只有这一个子节点。 这个性质 也是我解决这题的关键。 我的做法就是遍历 从中找到。想bccb这种的。 找到一个。 就说明有两种可能。 也就是二的多少次方? 这就是我做这题的思路。
#include<stdio.h>
#include<string.h>
#include<math.h>
int ans;
char str1[500],str2[500];
int main()
{
scanf("%s",str1);
scanf("%s",str2);
int m=strlen(str1);
int m1=strlen(str2);
for(int i=0;i<m;i++){
for(int j=m1-1;j>0;j--){
if(str1[i]==str2[j]&&str1[i+1]==str2[j-1]){
ans++;}}}
int s;
s=pow(2,ans);
printf("%d",s);
return 0;
}
还有就是一个并查集的题目,我想说一下。
题目如下。
这个题目因为有两组数据。所以我用了两个并查集。 分别将他们的关系进行合并。 然后再遍历找出所有与小明和小红有 共同祖宗的数据。 这样就找到了。两个公司,小明和小红的朋友。
唯一比较麻烦的一点。 就是他另一组是负的。 所以要用一点方法来处理一下。 我是将他变成正数。再加上一个n。
具体的代码就如下了。 这个题还是比较简单。
#include<stdio.h>
#include <algorithm>
using namespace std;
int n,m,p,q,ansm=0,ans1=0,f[1000000];
int find(int x)
{
if(f[x]==x){
return x;}
else {
f[x]=find(f[x]);
return f[x];}
}
void s(int x,int y)
{
f[find(x)]=find(y);
}
int main()
{
scanf("%d%d%d%d",&n,&m,&p,&q);
for(int i=1;i<=n+m;++i)
f[i]=i;
for(int i=1;i<=p;++i)
{
int a,b;
scanf("%d%d",&a,&b);
s(a,b);
}
for(int i=1;i<=q;++i)
{
int a,b;
scanf("%d%d",&a,&b);
a*=-1;b*=-1;
s(a+n,b+n);
}
for(int i=1;i<=n;++i){
if(find(i)==find(1)){
ansm++;}}
for(int i=n+1;i<=n+m;++i){
if(find(i)==find(n+1)){
ans1++;}}
printf("%d",min(ans1,ansm));
return 0;
}