题目链接:点击打开链接
题目大意:略。
解题思路:略。
AC 代码
#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
struct cmp
{
bool operator()(const char* s1,const char* s2) const
{
return strcmp(s1,s2)<0; // default:map 根据 key 排序(字典序)
}
};
map<char*,int,cmp> mp;
struct node
{
char name[20];
int par,space;
}*tree;
int n,m;
int calSp(char name[])
{
char c;
int cnt=0,k=0;
while((c=getchar())==' ') cnt++;
do
{
name[k++]=c;
}while((c=getchar())!='\n');
name[k]='\0';
return cnt;
}
// 往前遍历第一个比他缩进少的就是他的父亲,否则就是亚当夏娃
int trace(int child)
{
for(int i=child-1;i>=0;i--)
if(tree[i].space<tree[child].space) return i;
return -1;
}
int jde_child_parent(int aid, int bid)
{
if(tree[aid].par==aid) tree[aid].par=trace(aid);
return tree[aid].par==bid;
}
int jde_sibling(int aid, int bid)
{
if(tree[aid].par==aid) tree[aid].par=trace(aid);
if(tree[bid].par==bid) tree[bid].par=trace(bid);
return tree[aid].par==tree[bid].par;
}
int jde_desce_ancest(int aid, int bid)
{
while(aid!=-1)
if(jde_child_parent(aid,bid)) return 1;
else aid=tree[aid].par;
return 0;
}
void solve()
{
char a[20],with[20],b[20];
scanf("%s%*s%*s%s%*s%s",a,with,b);
int rs,aid=mp[a],bid=mp[b];
char op=with[0];
if(op=='c') rs=jde_child_parent(aid,bid);
else if(op=='p') rs=jde_child_parent(bid,aid);
else if(op=='s') rs=jde_sibling(aid,bid);
else if(op=='d') rs=jde_desce_ancest(aid,bid);
else if(op=='a') rs=jde_desce_ancest(bid,aid);
puts(rs?"True":"False");
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
mp.clear();
tree=(node*)malloc(sizeof(node)*n);
getchar();
for(int i=0;i<n;i++)
{
tree[i].space=calSp(tree[i].name);
tree[i].par=i; // init
mp[tree[i].name]=i;
}
tree[0].par=-1;
for(int i=0;i<m;i++) solve();
}
return 0;
}