问题描述:
思路:
用结构体来存储元素,的就是元素在树中的深度
存储的话采取链式前向星,用到栈是为了更好的找到新元素的父节点
也用到了贪心,除了最后一级,前面的要尽量的找到层级小的元素
#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<queue>
#include<stack>
using namespace std;
struct node
{
int de;
char A[100];
char B[100];
bool vis=false;
}D[110];
char C[100],sel[50][100];
int F[110],G[110],H[110];
priority_queue<int, vector<int>, greater<int> > q;
int num;
bool eq(char s1[],char s2[])
{
if(strlen(s1)!=strlen(s2))
{
return false;
}
for(int i=0;s1[i]!='\0';i++)
{
if(!((s1[i]==s2[i]|| s1[i] + 32 == s2[i] || s1[i] - 32 == s2[i])))return false;
}return true;
}
void dfs(int x,int ans,int ans1)
{
if(ans!=ans1)
{
if ((sel[ans][0] == '#' && D[x].vis && strcmp(D[x].B, sel[ans] + 1) == 0) ||
(sel[ans][0] != '#' && eq(D[x].A, sel[ans])))
{
for (int i = H[x]; i != -1; i = G[i])
{
int l = F[i];
dfs(l, ans + 1, ans1);
}
}
else
{
for (int i = H[x]; i != -1; i = G[i])
{
int l = F[i];
dfs(l, ans, ans1);
}
}
}
else
{
if ((sel[ans][0] == '#' && strcmp(D[x].B, sel[ans] + 1) == 0) ||
(sel[ans][0] != '#' && eq(D[x].A, sel[ans])))
{
q.push(x);
num ++;
}
for (int i = H[x]; i != -1; i = G[i])
{
int l = F[i];
dfs(l, ans, ans1);
}
}
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
getchar();
stack<int> rootStack;
memset(H, -1, sizeof(H));
for (int i = 1, ans = 0; i <= n; i++)
{
scanf("%[^\n]", C + 1);
getchar();
int dotNum = 0;
for (int j = 1; C[j] == '.'; j++)
{
dotNum ++;
}
D[i].de = dotNum / 2;
if (!rootStack.empty())
{
while (D[rootStack.top()].de >= dotNum / 2)
{
rootStack.pop();
}
int temp = rootStack.top();
F[ans] = i;
G[ans] = H[temp];
H[temp] = ans++;
}
rootStack.push(i);
sscanf(C + dotNum + 1, "%s", D[i].A);
if (C[dotNum + strlen(D[i].A) + 1] == ' ')
{
D[i].vis = true;
sscanf(C + dotNum + strlen(D[i].A) + 3, "%s", D[i].B);
}
}
while (m--)
{
scanf("%[^\n]", C + 1);
getchar();
int iter = 1;
int cnt = 0;
while (true)
{
sscanf(C + iter, "%s", sel[++cnt]);
iter += strlen(sel[cnt]) + 1;
if (C[iter-1] == '\0')
break;
}
num = 0;
dfs(1, 1, cnt);
printf("%d", num);
while (num != 0)
{
printf(" %d", q.top());
q.pop();
num --;
}
printf("\n");
}
return 0;
}