CCF CSP 201703 3.Markdown

模拟题,其实就是字符串的处理。

  1. main函数里处理三种区块,每个区块判别之后再对区块内容做行内处理(调用函数)。
  2. 区块之间有空行隔开,但是,输入的最后一个区块之后不一定会有空行。第一个空行内需要对其中两种区块(段落、无序列表)作结束处理(因为这两个区块可以是多行)。段落比较特殊,当前行的处理结果(行末加不加</p>)由下一行是不是空行决定,所以对段落延迟处理,下行再处理上行的那句段落。
  3. 设置一个状态变量block_status表示当前正在处理的区块类型。
  4. 注意审题,无序列表是开始插入一<ul>,最后插入一</ul>,不是行首行末插入。
  5. 这道题算比较简单了,规定两种行内结构只会互相嵌套一层,不会多层嵌套,也不会自我嵌套,但是,可以一种行内结构中并列嵌套多个另一种行内结构。不会多层嵌套和不会自我嵌套的好处就是判定结构的标识字符之后的下个最近的该结构的标识字符一定对应当前层(而且这两种结构本身字符也不重复)(不用设置符号栈了)。
  6. 所以,对两种结构分别各来一次循环就行了,不用想着在一次循环中处理同时处理两种结构(这样费事)。
  7. 而且这道题其实给的两种结构的标识体整体都不会跨行,很良心了。
  8. printf("%s",str.c_str());strstring,不能直接应用%s
  9. freopen("data.txt","r",stdin); 一行搞定直接从文件中读数据,这样省的在控制台输入输出分不清2333,输入数据文件data.txt要放在和当前cpp文件同一个文件夹下。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <string>
#include <queue>
using namespace std;

string str;
string temp;                   // 输出缓存
int block_status = 0;          // 1段落 2标题 3无序列表  0就绪下一个区块

string handleEM(string s)
{
	return "<em>" + s.substr(1, s.size() - 2) + "</em>";
}

string handleA(string s)
{
	int pos = 0;
	for (int i = 1; i < s.size(); i++)
	{
		if (s[i] == ']')
		{
			pos = i;
			break;
		}
	}
	return "<a href=\"" + s.substr(pos + 2, s.size() - (pos + 2) - 1) + "\">" + s.substr(1, pos - 1) + "</a>";
}

string handleLine(string s)
{
	string r1, r2;
	for (int i = 0; i < s.size();)
	{
		if (s[i] == '_')
		{
			int pos = 0;
			for (int j = i + 1; j < s.size(); j++)
			{
				if (s[j] == '_')
				{
					pos = j;
					break;
				}
			}
			r1 += handleEM(s.substr(i, pos - i + 1));
			i = pos + 1;
		}
		else
		{
			r1.push_back(s[i]);
			i++;
		}
	}

	for (int i = 0; i < r1.size();)
	{
		if (r1[i] == '[')
		{
			int pos = 0;
			for (int j = i + 1; j < r1.size(); j++)
			{
				if (r1[j] == ')')
				{
					pos = j;
					break;
				}
			}
			r2 += handleA(r1.substr(i, pos - i + 1));
			i = pos + 1;
		}
		else
		{
			r2.push_back(r1[i]);
			i++;
		}
	}

	return r2;
}

int main()
{
	//freopen("data.txt", "r", stdin);
	for (; getline(cin, str);)
	{
		if (str.size() == 0)
		{
			if (block_status == 3)
			{
				printf("</ul>\n");
				block_status = 0;
			}
			else if (block_status == 1)
			{
				printf("%s</p>\n", handleLine(temp).c_str());       // 输出上一行缓存的处理
				block_status = 0;
			}
			continue;
		}

		if (str[0] == '#')
		{
			block_status = 2;
			int level = 0;
			int pos = 0;
			for (int i = 0; i < str.size(); i++)
			{
				if (str[i] != '#') break;
				else level++;
			}
			for (int i = level; i < str.size(); i++)
			{
				if (str[i] != ' ')
				{
					pos = i;
					break;
				}
			}
			printf("<h%d>%s</h%d>\n", level, handleLine(str.substr(pos, str.size() - pos)).c_str(), level);
			block_status = 0;
		}
		else if (str[0] == '*')
		{
			if (block_status != 3)
			{
				block_status = 3;
				printf("<ul>\n");
			}
			int pos = 0;
			for (int i = 1; i < str.size(); i++)
			{
				if (str[i] != ' ')
				{
					pos = i;
					break;
				}
			}
			printf("<li>%s</li>\n", handleLine(str.substr(pos, str.size() - pos)).c_str());
		}
		else
		{
			if (block_status != 1)
			{
				block_status = 1;
				printf("<p>");
				temp = str;
			}
			else
			{
				printf("%s\n", handleLine(temp).c_str());
				temp = str;
			}
		}
	}

	{                                                           // 若输入最后无空行的话,模拟输入最后有空行
		if (block_status == 3)
		{
			printf("</ul>\n");
			block_status = 0;
		}
		else if (block_status == 1)
		{
			printf("%s</p>\n", handleLine(temp).c_str());       // 输出上一行缓存的处理
			block_status = 0;
		}
	}

	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
城市应急指挥系统是智慧城市建设的重要组成部分,旨在提高城市对突发事件的预防和处置能力。系统背景源于自然灾害和事故灾难频发,如汶川地震和日本大地震等,这些事件造成了巨大的人员伤亡和财产损失。随着城市化进程的加快,应急信息化建设面临信息资源分散、管理标准不统一等问题,需要通过统筹管理和技术创新来解决。 系统的设计思路是通过先进的技术手段,如物联网、射频识别、卫星定位等,构建一个具有强大信息感知和通信能力的网络和平台。这将促进不同部门和层次之间的信息共享、交流和整合,提高城市资源的利用效率,满足城市对各种信息的获取和使用需求。在“十二五”期间,应急信息化工作将依托这些技术,实现动态监控、风险管理、预警以及统一指挥调度。 应急指挥系统的建设目标是实现快速有效的应对各种突发事件,保障人民生命财产安全,减少社会危害和经济损失。系统将包括预测预警、模拟演练、辅助决策、态势分析等功能,以及应急值守、预案管理、GIS应用等基本应用。此外,还包括支撑平台的建设,如接警中心、视频会议、统一通信等基础设施。 系统的实施将涉及到应急网络建设、应急指挥、视频监控、卫星通信等多个方面。通过高度集成的系统,建立统一的信息接收和处理平台,实现多渠道接入和融合指挥调度。此外,还包括应急指挥中心基础平台建设、固定和移动应急指挥通信系统建设,以及应急队伍建设,确保能够迅速响应并有效处置各类突发事件。 项目的意义在于,它不仅是提升灾害监测预报水平和预警能力的重要科技支撑,也是实现预防和减轻重大灾害和事故损失的关键。通过实施城市应急指挥系统,可以加强社会管理和公共服务,构建和谐社会,为打造平安城市提供坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值