首页 > 其他分享 >洛谷 P2395 BBCode转换Markdown 题解

洛谷 P2395 BBCode转换Markdown 题解

时间:2022-12-31 17:55:05浏览次数:55  
标签:tmp case P2395 Markdown sta 题解 st break mp

洛谷 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;
}

标签:tmp,case,P2395,Markdown,sta,题解,st,break,mp
From: https://www.cnblogs.com/wang-yishan/p/17017045.html

相关文章

  • Codeforces Good Bye 2022 CF 1770 A~E 题解
    题目链接A.KoxiaandWhiteboards注意每一步替换操作都是强制的,而不是可选的。所以就用一个multiset维护所有的数,每次选一个最小的替换掉即可。时间复杂度\(O(nlogn)\)......
  • P4247 [清华集训2012]序列操作 题解
    线段树练手好题。直接上线段树五问:维护的信息是什么?由于\(c\le20\),我们不妨对线段树的每个节点维护一个\(f_k\)表示在对应区间里选择\(k\)个数相乘的所有方案的和......
  • markdown常用语法
    1.标题#一级标题##二级标题###三级标题####四级标题以此类推(注意空格)2.字体样式**字体加粗**字体加粗效果*斜体字* 斜体字效果***粗斜体字***~~......
  • 题解 CF1770B【Koxia and Permutation】
    \(k=1\)的情况是平凡的。\(k>1\)的情况,显然答案至少为\(n+1\),下面给出构造证明\(n+1\)总可以取到。可以构造\(p=[n,1,n-1,2,n-2,3,\cdots]\),此时以\(n\)作为最......
  • 题解 CF1770C【Koxia and Number Theory】
    显然,如果存在\(a_i=a_j\),则一定无解。否则,考虑每一个\(2\sim50\)的正整数\(k\),如果原数组每个数对\(k\)取模后,每种余数都出现至少两次,则无解。因为此时无论如何选......
  • Markdown
    Markdown学习字体两侧两个星号hello,world!两侧一个星号hello,world两侧三个星号hello,world两侧波浪号hello,world引用箭头>分割线三个---三个***图片![......
  • markdown语法学习
    MarkDown学习二级标题1正文二级标题2正文三级标题最多支持6级,n个#键加n个空格,后面就可以写第n级标题了字体Hello,World!Hello,World!前后各2个*Hello,World!前......
  • 【题解】P5574 [CmdOI2019]任务分配问题
    stocmd学长orz题意P5574[CmdOI2019]任务分配问题给定一个长度为\(n\)的排列,试将它分成\(k\)段,使得每段的顺序对数量之和最小。\(n\leq2.5\times10^4,k\l......
  • 【题解】P1912 [NOI2009] 诗人小G
    题意多测。给定\(n\)个字符串和一个常数\(L\),试将这些字符串分成若干组,使得:令\(len(i)\)为第\(i\)个字符串的长度,则每组字符串的\(|\sum\limitslen(i)-L|\)......
  • 【题解】P3158 [CQOI2011]放棋子
    兄弟们,我起了,一日之计在于晨呐。题意P3158[CQOI2011]放棋子有一个\(n\)行\(m\)列的棋盘和\(c\)种颜色的棋子,每种棋子有\(a_i\)个。要求不同颜色的棋子不能放......