1、这是一道较为繁琐的模拟题,我自己写怎么都写不对,也找不到原因,后来看了别人的题解才写对。
2、总的思想是这样的,以字符串为单位,将其压入vector v中,挨个处理,字符串可以是两头都没有尖括号的,也可以是两头都有尖括号的。
3、如果是< >类型,则在输出字符串后,将空格数+1,如果是</ >类型,则空格数减一,再输出字符串,如果是< />类型,当做普通字符串处理。
4、如果是普通字符串,则开头的一个正常输出,后面跟着的要与前一个间隔为1个空格。用flag来控制。
5、我刚开始将所有“普通字符串”作为一个单位压入了vector v中,结果总是出错,可能是读了一些不该读的东西。总之,用上述方法可以有效过滤掉空格,制表符,换行符。。。
#include<cstdio>
#include<vector>
#include<string>
#include<cctype>
#include<iostream>
#include<cstring>
using namespace std;
vector<string> v;
int main(){
//freopen("4782.in","r",stdin);
int T,cnt;
char ch;
char s[30000];
scanf("%d",&T);
for(int i=1;i<=T;i++){
v.clear();
ch=' ';
printf("Case #%d:\n",i);
while(1){
cnt=0;
while(isspace(ch)) ch=getchar();
if(ch=='<'){
do{
if(ch!='\n') s[cnt++]=ch;
}while((ch=getchar())!='>');
s[cnt++]='>';s[cnt]='\0';
v.push_back(string(s));
if(strcmp(s,"</html>")==0) break;
ch=getchar();
}else{
while(!isspace(ch)&&ch!='<'){
s[cnt++]=ch;
ch=getchar();
}
s[cnt]='\0';
v.push_back(string(s));
}
}
int num=v.size();
bool flag=false;
cnt=0;
for(int i=0;i<num;i++){
int len=v[i].size();
if(v[i][0]=='<'){
flag=false;
if(v[i][1]!='/'){
for(int j=0;j<cnt;j++)
printf(" ");
cout<<v[i];
if(v[i][len-2]!='/') cnt++;
}else{
cnt--;
for(int j=0;j<cnt;j++)
printf(" ");
cout<<v[i];
}
cout<<endl;
}else{
if(!flag){
for(int j=0;j<cnt;j++)
printf(" ");
cout<<v[i];
flag=true;
}else cout<<" "<<v[i];
if(v[i+1][0]=='<') cout<<endl;
}
}
}
return 0;
}