201809-3 元素选择器

模拟题,细心细心再细心,整个结构是一个树型的结构。

#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

*/

猜你喜欢

转载自blog.csdn.net/chenyume/article/details/88326861