首页 > 代码库 > HTML标记语言处理 HDU 4868
HTML标记语言处理 HDU 4868
思路:
本题要求大家能够存储特定的输出格式以及若干种HTML结构和映射关系,根据输入的HTML文本,寻找其结构,如果找不到结构与之匹配,输出“Can‘t
解决以下几点即可
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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。