考试时太紧张没做出来,心疼自己一秒钟,刷了很多字符串的题没派上用场,今天自己又思考了下,有了思路,写了几个样例都过了,等平台开发了测测代码能拿多少分(代码复杂度不高,O(n)级别)
#include<bits/stdc++.h>
using namespace std;
struct node
{
int hang;//行数
int level;//层数
string label;//标签
string id;//id
node(int hang,int level,string label,string id)
:hang(hang),level(level),label(label),id(id)
{
}
node()
{
}
};
int cmp(node a,node b)
{
if(a.level!=b.level)
return a.level < b.level;
else
return a.hang < b.hang;
}
node arr[101];
vector<string> V;
vector<int> A;
void solve(int st,int end,int pace,int level)
{
int i,j,k;
int min=0;
if(pace==V.size()-1)
{
for(i=st;i<=end;i++)
{
if(((arr[i].id==V[pace])||(arr[i].label==V[pace]))&&arr[i].level>=level)
{
A.push_back(i);
}
}
}
else
{
int mindex=-1;
int mlevel;
for(i=st;i<=end;i++)
{
if((arr[i].id==V[pace])||(arr[i].label==V[pace]))
{
mindex=i;
mlevel=arr[i].level;
break;
}
}
if(mindex!=-1)
{
for(;i<=end;i++)
{
if(((arr[i].id==V[pace])||(arr[i].label==V[pace]))&&arr[i].level<mlevel)
{
mindex=i;
mlevel=arr[i].level;
}
}
solve(st,arr[mindex].hang-2,pace,level+1);
solve(arr[mindex].hang,end,pace+1,mlevel+1);
}
}
}
int main()
{
string line;
int n,m;
// freopen("1.txt","r",stdin);
cin>>n>>m;
getchar();
int i,j,k;
int level;
string label,id;
for(i=0;i<n;i++)
{
getline(cin,line);
j=0;
while(j<line.length()&&line[j]=='.')
{
j++;
}
level=j/2;
k=line.find(' ',j+1);
if(k==-1)
{
label=line.substr(j,line.length()-j);
id="";
}
else
{
label=line.substr(j,k-j);
id=line.substr(k+1,line.length()-k-1);
}
arr[i]=node(i+1,level,label,id);
}
for(i=0;i<m;i++)
{
getline(cin,line);
j=0;
k=line.find(' ',j+1);
while(j<line.length())
{
if(k==-1)
k=line.length();
string temp=line.substr(j,k-j);
V.push_back(temp);
j=k+1;
k=line.find(' ',j+1);
}
solve(0,n-1,0,0);
V.clear();
sort(A.begin(),A.end());
cout<<A.size();
for(j=0;j<A.size();j++)
cout<<" "<<A[j]+1;
cout<<endl;
A.clear();
}
}