代码
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#include <algorithm>
#include <sstream>
#include <queue>
using namespace std;
struct node{
int parent;
int level;
string id;
string e;
};
node vec[110];
vector<int> parent[110];
vector<string> searVec;
queue<int> ans;
bool flag;
int num = 0;
void dfs(int len, int pos)
{
if(len==0)
{
num++;
return;
}
if(vec[vec[pos].parent].id == searVec[len] || vec[vec[pos].parent].e == searVec[len] )
dfs(len-1, vec[pos].parent);
}
string tolow(string s)
{
for(int i=0; i<s.length(); i++)
{
s[i] = tolower(s[i]);
}
return s;
}
int main()
{
int n, m;
cin >> n >> m;
string root;
cin >> root;
vec[0].e = root;
vec[0].parent = -1;
vec[0].level = 0;
vec[0].id = ' ';
parent[0].push_back(0);
getchar();
for(int i=1; i<n; i++)
{
string strData;
int dotCount;
int idPos;
getline(cin, strData);
dotCount = strData.rfind('.')+1;
idPos = strData.find('#');
vec[i].level = dotCount/2;
parent[dotCount/2].push_back(i);
vec[i].parent = parent[dotCount/2-1].back();
if(idPos == -1)
{
vec[i].e = strData.substr(dotCount);
vec[i].e = tolow(vec[i].e);
vec[i].id = ' ';
}
else
{
vec[i].e = strData.substr(dotCount, idPos-dotCount-1);
vec[i].e = tolow(vec[i].e);
vec[i].id = strData.substr(idPos);
}
}
// for(int i=0; i<n; i++)
// cout << vec[i].e << " " << vec[i].id << " " << vec[i].level << " " << vec[i].parent<<endl;
while(m--)
{
num = 0;
searVec.clear();
int len;
string strOption;
string strT;
getline(cin, strOption);
stringstream ss(strOption);
while(ss >> strT)
{
if(strT[0]!='#')
strT = tolow(strT);
searVec.push_back(strT);
}
len = searVec.size();
if(len == 1)
{
for(int i=0; i<n; i++)
{
if(vec[i].e == searVec[len-1] || vec[i].id == searVec[len-1])
{
num++;
ans.push(i+1);
}
}
}
else
{
for(int i=0; i<n; i++)
{
len = searVec.size()-1;
if(vec[i].id == searVec[len] || vec[i].e == searVec[len])
{
for(int j=i-1; j>=0&&vec[j].level<=vec[i].level; j--) //这里一定是j>=0
{
if(vec[j].level<vec[i].level)
{
if(vec[j].id == searVec[len-1] || vec[j].e == searVec[len-1])
{
len--;
if(len==0)
break;
}
}
}
}
if(len==0)
{
ans.push(i+1);
num++;
}
}
}
cout << num;
while(!ans.empty())
{
cout << " " << ans.front();
ans.pop();
}
cout << endl;
}
return 0;
}
总结
- 这是一道考试时候没写出来的题目,有点难过。
- 属于模拟题,主要是考查了字符串的匹配、截取的一些操作,熟悉 find, rfind, stringstream, substr等字符串操作
- 熟悉getline函数,注意getline使用前用getchar对cin的换行符处理
- 熟悉tolower函数
- 使用dfs发生运行错误,未找到原因