在某个 OJ 只有 50 分。
#include<bits/stdc++.h>
using namespace std;
string s;
string stck[100010];
int top=0;
void push(string ss)
{
stck[++top]=ss;
}
string get_top()
{
return stck[top];
}
void pop()
{
--top;
}
string ans[100010];
map<string,bool> cant;
map<string,bool> vvis;
int main()
{
//freopen("1.in","r",stdin);
cant["style"]=cant["script"]=cant["img"]=1;
vvis["html"]=vvis["div"]=vvis["p"]=vvis["span"]=vvis["img"]=vvis["style"]=vvis["script"]=vvis["a"]=vvis["ol"]=vvis["li"]=vvis["h2"]=1;
string tmp;
while(getline(cin,tmp)) s+=tmp;
int l=s.size();
int cnt=0;
for(int i=0; i<l; ++i)
{
if(s[i]=='<')
{
int now=i+1;
bool flag=0; // 结束/开始
if(s[now]=='/') ++now,flag=1;
string nnow="";
bool flag2=0; // 是否已经遇到空格(后面都不能有)
while(now<l && s[now]!='>')
{
if(s[now]==' ' || s[now]=='\t' || s[now]=='\n' || s[now]=='\r') flag2=1;
if(!flag2) nnow+=s[now];
++now;
}
i=now;
assert(vvis[nnow]);
if(nnow=="img") continue;
if(flag)
{
if(cant[nnow]) --cnt;
assert(get_top()==nnow);
pop();
}
else
{
if(cant[nnow]) ++cnt;
push(nnow);
}
}
else if(s[i]!='>' && s[i]!='/' && s[i]!=' ' && s[i]!='\t' && s[i]!='\n' && s[i]!='\r') // 标识符里的文本内容
{
int now=i;
string nnow="";
while(s[now]!='<' && s[now]!='>' && s[now]!='/') nnow+=s[now],++now;
if(!cnt)
{
int ccnt=0;
for(int j=1; j<=top; ++j)
{
assert(!cant[stck[j]]);
if(!cant[stck[j]]) ans[++ccnt]=stck[j];
}
for(int j=1; j<ccnt; ++j)
{
cout<<ans[j]<<'>';
}
cout<<ans[ccnt]<<':';
cout<<nnow<<endl;
}
i=now-1;
}
}
return 0;
}