02题解-洛谷 P2395 BBCode转换Markdown 题解
洛谷 P2395 BBCode转换Markdown 题解
题目传送门: here.
一道毒瘤的大模拟,给了你一部分的 BBCode 和 Markdown 语法,叫你转换。如下表:
| BBCode | Markdown |
|---|---|
[h1]文字[/h1] |
# 文字 # |
[h2]文字[/h2] |
## 文字 ## |
[i]文字[/i] |
*文字* |
[b]文字[/b] |
__文字__ |
[url=链接]文字[/url] |
[文字](链接) |
[img=地址]文字[/img] |
 |
[quote]文字[/quote] |
> 文字 |
如果标签没闭合输出Unclosed Mark , 标签配合不对输出Match Error。
虽然但是这代码一点也不像 Markdown 吧, > 不应该是区块标签嘛
有几个坑点:
- 临时用的变量一定要清空!特别是 string!
- 这里判断标签闭合和匹配可以使用栈
- 因为
url和img也可能嵌套,所以需要再开一个栈存储它们的地址。 [quote]的判断比较特殊,里面的东西保持原样,所以如果遇到这个标签可以一次性读到[/quote]闭合标签,或者EOF。- 最后就是细心了!这玩意我调了两天!
代码:(可能有点丑,见谅)
#include <iostream>
#include <map>
#include <string>
#include <stack>
using namespace std;
enum OPER // 方便switch的东西
{
NULOP,
H1 = 1, // 一级标题
H2, // 二级标题
I, // 斜体
B, // 粗体
URL, // 链接
IMG, // 图片
QUOTE, // 代码段
_H1 = 11, // 一级标题
_H2, // 二级标题
_I, // 斜体
_B, // 粗体
_URL, // 链接
_IMG, // 图片
_QUOTE // 代码段
};
stack<OPER> sta; //用来存标签
stack<string> stac; // 用来存url、img的地址
map<string, OPER> mp; // 方便switch的东西
string s, t, op1, o;
string tmp;
char st;
int Wrong = 1; // 2 Match Error 3 Unclos ed Mark
void init()//对map映射的处理
{
mp["h1"] = H1;
mp["/h1"] = _H1;
mp["h2"] = H2;
mp["/h2"] = _H2;
mp["/i"] = _I;
mp["i"] = I;
mp["/b"] = _B;
mp["b"] = B;
mp["/url"] = _URL;
mp["url"] = URL;
mp["/img"] = _IMG;
mp["img"] = IMG;
mp["/quote"] = _QUOTE;
mp["quote"] = QUOTE;
return;
}
int main()
{
// ios::sync_with_stdio(false);
init();
st = getchar();
while (st != EOF){
if (st == '['){
op1.clear();
t.clear();
tmp.clear();
st = getchar();
for (int i = 0; st != ']'&&st!='='&&st!=EOF; i++){
op1.push_back(st);
st = getchar();
}
if (st == '='){
st = getchar();
while (st != ']'&&st!=EOF){
t.push_back(st);
st = getchar();
}
}
switch (mp[op1]){
case H1:
sta.push(H1);
s += "# ";
break;
case _H1:
if (!sta.empty() && sta.top() == H1){
s += " #";
sta.pop();
}
else{
Wrong = 2;
goto ERROR;
}
break;
case H2:
sta.push(H2);
s += "## ";
break;
case _H2:
if (!sta.empty() && sta.top() == H2){
s += " ##";
sta.pop();
}
else{
Wrong = 2;
goto ERROR;
}
break;
case I:
sta.push(I);
s += "*";
break;
case _I:
if (!sta.empty() && sta.top() == I){
s += "*";
sta.pop();
}
else{
Wrong = 2;
goto ERROR;
}
break;
case B:
sta.push(B);
s += "__";
break;
case _B:
if (!sta.empty() && sta.top() == B){
s += "__";
sta.pop();
}
else{
Wrong = 2;
goto ERROR;
}
break;
case URL:
sta.push(URL);
s += "[";
stac.push(t);
break;
case _URL:
if (!sta.empty() && sta.top() == URL && !stac.empty()){
s.append("](" + stac.top() + ")");
sta.pop();
stac.pop();
}
else{
Wrong = 2;
goto ERROR;
}
break;
case IMG:
sta.push(IMG);
s += " + ")");
sta.pop();
stac.pop();
}
else{
Wrong = 2;
goto ERROR;
}
break;
case QUOTE:
st = getchar();
while (st == '\n')
st = getchar();
while (1){
tmp.push_back(st);
if (tmp.length() > 7 && tmp.substr(tmp.length() - 8) == "[/quote]")
break;
if (st == EOF){
Wrong = 3;
goto ERROR;
}
st = getchar();
}
tmp = tmp.substr(0, tmp.length() - 8);
while (tmp.back() == '\n')
tmp.pop_back();
if (s.back() != '\n' && !s.empty())
s.push_back('\n');
if (s.empty())
s.append("> ");
if (s.back() == '\n')
s.append("> ");
for (int i = 0; i < (int)tmp.length(); i++){
s.push_back(tmp[i]);
if (tmp[i] == '\n'){
s.append("> ");
}
}
if(tmp.back()!='\n')
s.append("\n");
break;
case _QUOTE:
Wrong = 2;
goto ERROR;
default:
// cout << "ERROR!!!!!!!!!!!!!!!!";
Wrong = 2;
goto ERROR;
}
}
else
s.push_back(st);
st = getchar();
}
ERROR:
if (Wrong == 2)
cout << "Match Error";
else{
if (!sta.empty() || Wrong == 3){
cout << "Unclosed Mark";
}
else
cout << s;
}
return 0;
}
附赠一组大样例:
输入:
[h1]emm[/h1][quote]q1[/quote][h1][quote][img=1]ii[/img]
q2[/quote][/h1]
[i][b]ib[/b][/i]
[img=1][url=2][/url][h1]cool[/h1][/img]
输出:
# emm #
> q1
#
> [img=1]ii[/img]
> q2
#
*__ib__*
# cool #](1)
02题解-洛谷 P2395 BBCode转换Markdown 题解的更多相关文章
- 题解——洛谷P2734 游戏A Game 题解(区间DP)
题面 题目背景 有如下一个双人游戏:N(2 <= N <= 100)个正整数的序列放在一个游戏平台上,游戏由玩家1开始,两人轮流从序列的任意一端取一个数,取数后该数字被去掉并累加到本玩家的 ...
- 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)
洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...
- 洛谷P1783 海滩防御 分析+题解代码
洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...
- 洛谷P4047 [JSOI2010]部落划分题解
洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...
- 洛谷P1310 表达式的值 题解 栈/后缀表达式的应用
题目链接:https://www.luogu.org/problem/P1310 本题涉及算法:栈.前缀表达式转后缀表达式,动态规划思想. 这道题目我思考了好长时间,第一时间让我做的话我也做不出来. ...
- [洛谷日报#204] StackEdit——Markdown 编辑器的功能介绍
本文同时发表于洛谷日报,您也可以通过洛谷博客进行查看. 1.介绍与开始使用 1.1 这是什么? StackEdit是基于PageDown.Stack Overflow和其他堆栈交换站点使用的Markd ...
- 洛谷10月月赛II题解
[咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...
- [洛谷P1823]音乐会的等待 题解(单调栈)
[洛谷P1823]音乐会的等待 Description N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没 ...
- BZOJ2527 & 洛谷3527:[Poi2011]Meteors——题解
+++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...
- 洛谷 p1516 青蛙的约会 题解
dalao们真是太强了,吊打我无名蒟蒻 我连题解都看不懂,在此篇题解中,我尽量用语言描述,不用公式推导(dalao喜欢看公式的话绕道,这篇题解留给像我一样弱的) 进入正题 如果不会扩展欧里几德的话请先 ...
随机推荐
- echarts学习
一.安装与引入 1.安装npm install echarts --save 2.引入import * as echarts from 'echarts';(main.js里全局引入) 二.详细概念 ...
- JAVA课程设计(附源码)
Java课程设计选题 Java课程设计说明 本次课程设计的目的是通过课程设计的各个项目的综合训练,培养学生实际分析问题.编程和动手能力,提高学生的综合素质.本课程设计尝试使用一些较生动的设计项目,激发 ...
- Qt excel操作相关
#include <QDebug> #include <QAxObject> #include <QStandardPaths> #include <QFil ...
- C++ primer笔记 -基本语言
C++最重要的特征是类,程序员可以使用类自定义数据类型,C++有时候将这些类型称为"类类型",以区别于内置类型. 类型作用: 1.告诉我们数据代表的是什么意思 2.对数据可以执行哪 ...
- RestTemplate 连接池最大链接数
原文链接:https://www.cnblogs.com/x-x-736880382/p/11591906.html 以前我们项目都是基于Apache HttpClient 连接池进行web 接口调用 ...
- linux 查看端口号是否对外开放,并开放端口号
查看对外开放的端口状态查询指定端口是否已开 firewall-cmd --query-port=8780/tcp 提示 yes,表示开启:no表示未开启. 对外开发端口 查看想开的端口是否已开:fir ...
- Linux出现Read-only file system错误解决方法
执行命令时遇到如下错误 这个问题是文件系统受损导致得,fstab文件未正确配置 解决方法: df -hT #查看一下分区及挂载信息 fsck -a /dev/sda3 -a :检查文件系统,有异常便自 ...
- 【ZYNQ学习】各个主题的值得看的博客
在学习ZYNQ时会遇到不少问题,这时我们一方面要在DocNav找Xilinx的官方文档,另一方面要参考别人的一些记录的解决好的办法,我在学习的时候看到了不少大佬的博客,给我带来了很大帮助.在这篇博客, ...
- leetcode 94. 二叉树的中序遍历【时间击败99.19%】 【内存击败39.48%】
public List<Integer> inorderTraversal(TreeNode root) { ArrayList<Integer>al=new ArrayLis ...
- KVM虚拟机迁移至VMWare ESXi
需求 由于服务器迁移,为维护方便,将统一使用vmware 平台管理虚拟机,因此需将kvm 虚拟机统一迁至vmware kvm 磁盘镜像转换 查看虚拟机 # virsh list --all Id Na ...