求调 thusc D2T1
  • 板块题目总版
  • 楼主王熙文
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/5/25 10:49
  • 上次更新2023/10/28 00:40:21
查看原帖
求调 thusc D2T1
353688
王熙文楼主2022/5/25 10:49

在某个 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;
}
2022/5/25 10:49
加载中...