CSP-20180903
把之前写的题目整理了一下,不知道CSDN有没有再编辑功能,等以后有空再说。
#include<iostream>
#include<string>
#include<cstring>
#include<vector>
using namespace std;
const int N=110;
struct node
{
string label,id;//标签无视大小写,属性
int cnt;//缩进
}a[N];
void lower(string &s)
{
for(int i=0;i<s.length();i++)
s[i]=tolower(s[i]);
}
bool research(node a[],int &start,int &cnt,string s)
{
for(int i=start;i>=1;i--)
{
if(a[i].cnt<cnt)
{
cnt=a[i].cnt,start=i;
if(s==a[i].id||s==a[i].label)
return true;
}
}
return false;
}
int main()
{
int n,m;
string s;
cin>>n>>m;
getchar();
for(int i=1;i<=n;i++)
{
getline(cin,s);
int pos1=-1,pos2=-1,cnt=0;
for(int j=0;j<s.length();j++)
if(s[j]=='.')
cnt++;
else if(s[j]!='#'&&pos1==-1)
pos1=j;
else if(s[j]=='#')
pos2=j;
a[i].cnt=cnt;
if(pos2==-1)
{
a[i].label=s.substr(pos1);
a[i].id="";
}
else
{
a[i].label=s.substr(pos1,pos2-pos1-1);
a[i].id=s.substr(pos2);
}
lower(a[i].label);
}
/*for(int i=1;i<=n;i++)
{
cout<<a[i].cnt<<a[i].id<<a[i].label<<endl;
}*/
for(int i=0;i<m;i++)
{
char temp[100];
vector<string>query;
vector<int>ans;
gets(temp);
char *sp=strtok(temp," ");
while(sp)
{
query.push_back(sp);
sp=strtok(NULL," ");
}
int leng=query.size();
for(int j=0;j<leng;j++)
{
if(query[j][0]!='#')
lower(query[j]);
}
for(int j=1;j<=n;j++)//查找
{
if(query[leng-1]==a[j].id||query[leng-1]==a[j].label)//最后一级匹配
{
int k=leng-2,cnt=a[j].cnt,start=j;
for(;k>=0;k--)
if(!research(a,start,cnt,query[k]))
break;
if(k<0)
ans.push_back(j);
}
}
cout<<ans.size();
if(ans.size()>0)
{
for(int kk=0;kk<ans.size();kk++)
cout<<" "<<ans[kk];
}
cout<<endl;
}
return 0;
}