洛谷 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 吧, > 不应该是区块标签嘛

有几个坑点:

  1. 临时用的变量一定要清空!特别是 string!
  2. 这里判断标签闭合和匹配可以使用栈
  3. 因为 urlimg 也可能嵌套,所以需要再开一个栈存储它们的地址。
  4. [quote]的判断比较特殊,里面的东西保持原样,所以如果遇到这个标签可以一次性读到[/quote]闭合标签,或者EOF。
  5. 最后就是细心了!这玩意我调了两天!

代码:(可能有点丑,见谅)

#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 += "![";
stac.push(t);
break;
case _IMG:
if (!sta.empty() && sta.top() == IMG && !stac.empty()){
s.append("](" + stac.top() + ")");
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__*
![[](2)# cool #](1)

02题解-洛谷 P2395 BBCode转换Markdown 题解的更多相关文章

  1. 题解——洛谷P2734 游戏A Game 题解(区间DP)

    题面 题目背景 有如下一个双人游戏:N(2 <= N <= 100)个正整数的序列放在一个游戏平台上,游戏由玩家1开始,两人轮流从序列的任意一端取一个数,取数后该数字被去掉并累加到本玩家的 ...

  2. 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)

    洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...

  3. 洛谷P1783 海滩防御 分析+题解代码

    洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...

  4. 洛谷P4047 [JSOI2010]部落划分题解

    洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...

  5. 洛谷P1310 表达式的值 题解 栈/后缀表达式的应用

    题目链接:https://www.luogu.org/problem/P1310 本题涉及算法:栈.前缀表达式转后缀表达式,动态规划思想. 这道题目我思考了好长时间,第一时间让我做的话我也做不出来. ...

  6. [洛谷日报#204] StackEdit——Markdown 编辑器的功能介绍

    本文同时发表于洛谷日报,您也可以通过洛谷博客进行查看. 1.介绍与开始使用 1.1 这是什么? StackEdit是基于PageDown.Stack Overflow和其他堆栈交换站点使用的Markd ...

  7. 洛谷10月月赛II题解

    [咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...

  8. [洛谷P1823]音乐会的等待 题解(单调栈)

    [洛谷P1823]音乐会的等待 Description N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没 ...

  9. BZOJ2527 & 洛谷3527:[Poi2011]Meteors——题解

    +++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...

  10. 洛谷 p1516 青蛙的约会 题解

    dalao们真是太强了,吊打我无名蒟蒻 我连题解都看不懂,在此篇题解中,我尽量用语言描述,不用公式推导(dalao喜欢看公式的话绕道,这篇题解留给像我一样弱的) 进入正题 如果不会扩展欧里几德的话请先 ...

随机推荐

  1. #maxlength vs #size form api reference

    #maxlength Used by: password, textfield Description: The maximum amount of characters to accept as i ...

  2. 蓝桥杯训练赛二-问题 B

    字符串的输入输出处理. 输入 第一行是一个正整数N,最大为100.之后是多行字符串(行数大于N), 每一行字符串可能含有空格,字符数不超过1000. 输出 先将输入中的前N行字符串(可能含有空格)原样 ...

  3. Unity 凹多边形三角剖分

    游戏中需要实现一个小功能,显示一个玩家的能力图,这个图是一个有6个顶点任意摆放组合的多边形.而绘制多边形主要用到的知识就是Mesh构建,mesh的构建主要需要顶点列表,三角形列表,法线列表.uv列表等 ...

  4. signature

    signature可以翻译成基调.特征标记.签名.

  5. 解决从PLSQL导出到CSV文件的时候提示 is not a valid date and time的问题

    操作下面步骤的时候,报出[XXXXXis not a valid date and time]的错误 问题原因:以前嫌弃任务栏右下角的时间显示格式不好,手动手改了一下,导致Oracle的日期格式与现在 ...

  6. Codeforces Global Round 17 - D. Not Quite Lee

    裴蜀定理 + lowbit Problem - D - Codeforces 题意 定义一个包含 \(m\) 个元素的数组 \(b\) 是好的,当且仅当满足以下两个条件 对于 \(b[i]\), 存在 ...

  7. 03 Spark RDD编程基础

    1. 准备文本文件从文件创建RDD lines=sc.textFile()筛选出含某个单词的行 lines.filter() 2. 生成单词的列表从列表创建RDD words=sc.paralleli ...

  8. IntelliJ IDEA 生成serialVersionUID

    1.设置Settings-->Editor->Inspections 2.实现Serializble

  9. Python request模块 携带cookie

    # _*_coding:utf-8 _*_ import time import requests import json import sys import random import string ...

  10. vue项目中如何使用markdown编辑器插件

    1.安装mavon-editor $ npm install mavon-editor --save 需要使用Markdown编辑器的页面js中: import { mavonEditor } fro ...