首页 > 代码库 > HTML标记语言处理 HDU 4868

HTML标记语言处理 HDU 4868

思路:

本题要求大家能够存储特定的输出格式以及若干种HTML结构和映射关系,根据输入的HTML文本,寻找其结构,如果找不到结构与之匹配,输出“Can‘t Identify”,如果只有一个,根据映射关系以及输出格式的要求输出结果,如果有多个,则使用最早输入的那个结构。

解决以下几点即可

1、对HTML输入的读取

2、判断结构是不是输入的HTML文本的结构

3、根据映射以及输出格式的要求输出结果

注意映射关系中可能有一个id到多个标签,并且这些标签在输入格式中是存在多个的。

#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
const int N=10010;
const int M=35;
char html[M][N],stored[M][N],sta1[N][M];
char mapping[M][M][2][M];
int mapNum[M],sta2[N];

void getHTML(int n)
{
    int j,i=0,flag=1;
    char beginTag[M],tag[M];
    getchar();
    while(1)
    {
        html[n][i]=getchar();
        if(html[n][i]=='<')
        {
            j=0;
            while(html[n][++i]=getchar())
            {
                if(html[n][i]=='/')continue;
                if(html[n][i]==' '||html[n][i]=='>')break;
                tag[j++]=html[n][i];
            }
            tag[j]='\0';
            if(flag==1)
            {
                strcpy(beginTag,tag);
                flag=0;
            }
            else if(!strcmp(tag,beginTag))
            {
                html[n][++i]='\0';
                return;
            }
        }
        i++;
    }
}
void getMapping(int n,int m)
{
    int i,j;
    char mp[100];
    cin>>mp;
    for(i=0; mp[i]!='-'; i++)
        mapping[n][m][0][i]=mp[i];
    mapping[n][m][0][i]='\0';
    for(j=0,i++; i<strlen(mp); i++,j++)
        mapping[n][m][1][j]=mp[i];
    mapping[n][m][1][j]='\0';
}
void getTag(int n,int i,char tag[])
{
    int j=0;
    while(1)
    {
        i++;
        if(html[n][i]=='/')continue;
        if(html[n][i]==' '||html[n][i]=='>')break;
        tag[j++]=html[n][i];
    }
    tag[j]='\0';
}
int getId(int n,int i,char id[])
{
    int j;
    id[0]='\0';
    char tmp[M];
    while(html[n][i]==' ')
    {
        j=0;
        while(html[n][++i]!='=')
            tmp[j++]=html[n][i];
        tmp[j]='\0';
        if(!strcmp(tmp,"id"))
        {
            i++;
            j=0;
            while(html[n][++i]!='"')
                id[j++]=html[n][i];
            id[j]='\0';
        }
        else
        {
            i++;
            while(html[n][++i]!='"');
        }
        i++;
    }
    return i;
}
void store(int n,int i,int j,char tag[])
{
    stored[j][0]='\0';
    int k,y=0,flag=0,len=strlen(tag);
    for(i++;; i++)
    {
        k=0;
        if(html[n][i]=='<')
            for(; k<len; k++)
                if(tag[k]!=html[n][i+1+k])break;
        if(k==len)flag++;
        k=0;
        if(html[n][i]=='<'&&html[n][i+1]=='/')
            for(; k<len; k++)
                if(tag[k]!=html[n][i+2+k])break;
        if(k==len)
        {
            if(!flag)
            {
                stored[j][y]='\0';
                return;
            }
            else flag--;
        }
        stored[j][y++]=html[n][i];
    }
}
bool isStructure(int n,int m)
{
    int i,j,k,ii,flag=0,top=-1;
    char tag[M],id[M],tag2[M],id2[M];
    int len1=strlen(html[n]);
    for(i=k=0; i<len1;)
    {
        ii=i;
        while(html[n][i]==' '||html[n][i]=='\n')i++;
        while(html[m][k]!='<')k++;
        getTag(n,i,tag);
        getTag(m,k,tag2);
        if(strcmp(tag,tag2)||html[n][i+1]!=html[m][k+1])
        {
            if(!strcmp(tag,tag2))sta2[top]++;
            if(!flag)
            {
                return false;
            }
            while(html[m][k]!='>')k++;
            i=ii;
            continue;
        }
        if(html[n][i+1]=='/') //</xx>
        {
            if(!sta2[top])
            {
                i+=strlen(tag)+3;
                flag--;
            }
            else sta2[top]--;
            k+=strlen(tag)+3;
        }
        else  //<xx>或者<xx/>
        {
            i+=strlen(tag)+1;
            k+=strlen(tag2)+1;
            if(html[n][i]==' ') //有id
            {
                if(html[m][k]!=' ')
                {
                    if(!flag)
                    {
                        return false;
                    }
                    while(html[m][k]!='>')k++;
                    i=ii;
                    continue;
                }
                i=getId(n,i,id);
                k=getId(m,k,id2);
                if(strcmp(id,id2))
                {
                    if(!flag)
                    {
                        return false;
                    }
                    while(html[m][k]!='>')k++;
                    i=ii;
                    continue;
                }
            }
            for(j=0; j<mapNum[n]; j++)
                if(!strcmp(id,mapping[n][j][0]))
                    break;
            if(html[n][i]=='/') //<xx/>
            {
                i+=2;
                k+=2;
            }
            else  //<xx>
            {
                if(j!=mapNum[n]) //需映射的id
                {
                    strcpy(sta1[++top],tag);
                    flag++;
                    sta2[top]=0;
                    for(j=0; j<mapNum[n]; j++)
                        if(!strcmp(id,mapping[n][j][0]))
                            store(m,k,j,tag);
                }
                i++;
                k++;
            }
        }
    }
    return true;
}
void output(int n)
{
    int i,j,k,ii;
    char tag[M];
    int len1=strlen(html[0]);
    for(i=0; i<len1;)
    {
        while(i<len1&&html[0][i]!='<')
            putchar(html[0][i++]);
        if(i==len1)break;
        getTag(0,i,tag);
        for(j=0; j<mapNum[n]; j++)
            if(!strcmp(tag,mapping[n][j][1]))
                break;
        if(j==mapNum[n])
        {
            putchar(html[0][i++]);
            continue;
        }
        else
        {
            int len=strlen(tag);
            ii=i;
            for(i+=len+1;; i++)
            {
                k=0;
                if(html[0][i]=='<'&&html[0][i+1]=='/')
                    for(; k<len; k++)
                        if(tag[k]!=html[0][i+2+k])break;
                if(k==len)break;
            }
            while(html[0][ii]!='>')
                putchar(html[0][ii++]);
            putchar(html[0][ii++]);
            cout<<stored[j];
            while(html[0][i]!='>')
                putchar(html[0][i++]);
            putchar(html[0][i++]);
        }
    }
}

int main()
{
    //freopen("data.in","r",stdin);
    //freopen("data.out","w",stdout);
    int t,ca=1;
    scanf("%d",&t);
    while(t--)
    {
        int i,j,n,m;
        getHTML(0);
        scanf("%d",&n);
        for(i=1; i<=n; i++)
        {
            getHTML(i);
            scanf("%d",&mapNum[i]);
            for(j=0; j<mapNum[i]; j++)
                getMapping(i,j);
        }
        getHTML(n+1);
        printf("Case #%d:\n",ca++);
        for(i=1; i<=n; i++)
            if(isStructure(i,n+1))
            {
                output(i);
                break;
            }
        if(i==n+1)printf("Can't Identify\n");
        else putchar('\n');
    }
    return 0;
}


HTML标记语言处理 HDU 4868