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喜欢看公式的话绕道,这篇题解留给像我一样弱的) 进入正题 如果不会扩展欧里几德的话请先 ...
随机推荐
- springboot配置文件中的基本配置
#应用启动端口设置server.port=9088#=================================微信相关====================================# ...
- hierarchical-clustering
https://ww2.mathworks.cn/help/stats/hierarchical-clustering.html https://ww2.mathworks.cn/help/stats ...
- 为什么vue3要使用ref
vue3中使用ref来创建响应式数据,让习惯了选项式API的我很不习惯.因为得使用xxx.value来读写响应式数据,没有vue2中直接使用this.xxx来读写简洁. vue3这样设计的原因是原生J ...
- CICD中一个巨头--jenkins
持续化集成,发布离不开CICD,CICD中有最重要的一个程序就是jenkins,本章主要讲jenkins部署和建立项目任务 jenkins的出现,大大的提高了代码上线问题,通过图中可以看出,开发人员通 ...
- 假设页面左侧有一个列表,点击列表某一项时,将根据当前id发起一个请求,并将响应结果展示在右侧。如果快速多次点击不同列表项,当网络不稳定时,请求返回的顺序与我点击顺序不符,导致展示的结果不是我最后一次点击的对应结果,怎么办?
1.防抖/节流方案 ,不可完全避免,请求数据时间不一致2.如果使用ajax/axios,发起请求时可直接取消上一次未完成的请求可实现3.临时记录最后一次的id,要求服务器返回时携带id,对比选择后渲染 ...
- Java流程控制之DoWhile循环
DoWhile循环 对于while语句而言,如果不满足条件,则不能进入循环.但有时候我们需要即使不满足条件,也至少执行一次. do...while 循环和 while循环相似,不同的是,do...wh ...
- oracle常用知识随笔
1.创建表空间及用户赋权 create tablespace spaceone datafile '/dev/spaceone'size 80mextent management localsegme ...
- Mac下Apache Tomcat安装配置技巧
我们在MAC系统中查看网页时,一般都要使用到tomcat,这是因为appache只支持静态网页,但像asp,php,cgi,jsp等动态就需要tomcat来处理.那么该怎么在自己的MAC中安装tomc ...
- TypeScript String(字符串)
TypeScript String(字符串) String 对象用于处理文本(字符串). 语法 var txt = new String("string"); 或者更简单方式: v ...
- mac 查看,终止进程
找到其他 活动监视器 在这里可以查看和cpu占用 杀死有问题的过程: 1.它占用了大量CPU周期或内存, 2.在"活动监视器"中被突出显示为已崩溃, 先单击该过程,点击x可以终止进 ...