模拟题,细心细心再细心,整个结构是一个树型的结构。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const double epos=1e-8;
char s[109][89];
char qq[89];
int id_qi[109];//记录每个标签的id起始点,没有则为0;
int dian[109];//记录s[i]的点的个数;
int a[109];//记录每次查询的结果;
int v[109];//多级查询时,分割串;
int main(){
int n,q;
scanf("%d%d",&n,&q);
getchar();
for(int i=1; i<=n; ++i){
fgets(s[i],89,stdin);
int t=strlen(s[i]);
--t;
s[i][t]='\0';//fgets()使用时会多吸收一个换行符到字符串中,所以需要将长度减一;
int j=0;
for(; j<t; ++j){
if(s[i][j]=='#'){
id_qi[i]=j;
break;
}
if(s[i][j]=='.')
++dian[i];
else if(s[i][j]>='A'&&s[i][j]<='Z')//将标签变为小写字母;
s[i][j]+=32;
}
}
while(q--){
int l=0;
fgets(qq,89,stdin);
int lq=strlen(qq);
--lq;
qq[lq]='\0';
//分割串;
int h=0;
v[0]=0;
int lv=1;
for(int i=0; i<lq; ++i){
if(qq[i]==' ')
++h;
if(qq[i]==' '&&qq[i+1]!='#')
v[lv++]=i+1;
if(qq[i]=='#'&&i)
v[lv++]=i;
}
if(h)//多级结构;{
int t=0;//结果个数;
int qqdian=-1;//需要的点数;
int k=0;//v下标;
int i=1;
while(i<=n&&k<(lv-1)){//多级结构,将除了最后一部分,找到应该在的位置;
if(dian[i]<=qqdian){//一个节点的点数一定严格大于其父亲的点数;
++i;
continue;
}
int len=strlen(s[i]);
if(qq[v[k]]=='#'){
if(!id_qi[i]){ ++i; continue; }
int j=id_qi[i];
int z;
for(z=v[k]; z<v[k+1]-1&&j<len; ++z,++j)
if(s[i][j]!=qq[z])
break;
if(z>=v[k+1]-1&&j>=len){
qqdian=dian[i];
++k;
++i;
continue;
}
}
else{
int j=dian[i];
len=(id_qi[i]?id_qi[i]-1:len);//该标签有id的话,匹配时去掉标签;
//cout<<len<<endl;
int z;
for(z=v[k]; z<v[k+1]-1&&j<len; ++z,++j){
if(qq[z]>='A'&&qq[z]<='Z')
qq[z]+=32;
if(qq[z]!=s[i][j])
break;
}
if(z>=v[k+1]-1&&j>=len){
qqdian=dian[i];
++k;
++i;
continue;
}
}
++i;
}
if(qq[v[k]]=='#'){
while(i<=n){
if(id_qi[i]==0||dian[i]<=qqdian){
++i;
continue;
}
int j=id_qi[i];
int len=strlen(s[i]);
int z;
for(z=v[k]; z<lq&&j<len; ++z,++j)
if(qq[z]!=s[i][j])
break;
if(z>=lq&&j>=len){
a[t]=i;
++t;
}
++i;
}
}
else{
while(i<=n){
if(dian[i]<=qqdian){
++i;
continue;
}
int len=strlen(s[i]);
len=(id_qi[i]?id_qi[i]-1:len);
int j=dian[i];
int z;
for(z=v[k]; z<lq&&j<len; ++z,++j){
if(qq[z]>='A'&&qq[z]<='Z')
qq[z]+=32;
if(qq[z]!=s[i][j])
break;
}
if(z>=lq&&j>=len){
a[t]=i;
++t;
}
++i;
}
}
printf("%d",t);
for(int i=0; i<t; ++i)
printf(" %d",a[i]);
printf("\n");
}
else
{
if(qq[0]=='#'){//查询id;
int flag=0;
for(int i=1; i<=n; ++i){
int f=1;
int len=strlen(s[i]);
int j=id_qi[i];
if(!j) continue;
if(lq!=len-j) continue;
for(int k=0; k<lq; ++k,++j)
if(qq[k]!=s[i][j]){
f=0;
break;
}
if(f){
printf("1 %d\n",i);
flag=1;
break;
}
}
if(!flag)
printf("0\n");
continue;
}
//查询标签;
for(int i=1; i<=n; ++i){
int f=1;
int j=dian[i];
int len=strlen(s[i]);
int k=0;
if(id_qi[i]) len=id_qi[i]-1;
for(; j<len&&k<lq; ++j,++k){
if(qq[k]>='A'&&qq[k]<='Z')
qq[k]+=32;
if(s[i][j]!=qq[k]){
f=0;
break;
}
}
if(k<lq||j<len)
f=0;
if(f){
a[l]=i;
++l;
}
}
printf("%d",l);
for(int k=0; k<l; ++k)
printf(" %d",a[k]);
printf("\n");
}
}
return 0;
}
/*
11 5
html
..head
....title
..body
....h1
....p #subtitle
....div #main
......h2
......p #one
......div
........p #two
#subtitle
*/