hdu 4964 Emmet()模拟

hdu 4964 Emmet()模拟

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

题目链接:hdu 4964 Emmet

题目大意: 给定语句,依照语法翻译并输出。

解题思路:用递归模拟文法分析,主要注意几点:

  1. 括号而且的情况:(fuck)(you)
  2. 括号嵌套的情况:((fuck.you))
  3. 优先输出id,然后是class(题目中有说)
  4. 乘法的部分:fuck*2>you*3 (每次运行fuck时。you的地方相同被运行了3次)

其它跑出例子基本没问题,详细看代码。

#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;
typedef vector<string> VS;
const int manx = 1005;

int mv, N;
string str, word;

bool isletter (char ch) {
    if (ch >= 'a' && ch <= 'z')
        return true;
    if (ch >= 'A' && ch <= 'Z')
        return true;
    if (ch >= '0' && ch <= '9')
        return true;
    if (ch == '_')
        return true;
    return false;
}

int changeTonumber () {
    int ret = 0;
    for (int i = 0; i < word.size(); i++)
        ret = ret * 10 + word[i] - '0';
    return ret;
}
string getword () {
    string cur = "";
    while (isletter(str[mv]))
        cur = cur + str[mv++];
    mv--;
    return cur;
}

void gettoken () {

    if (mv == str.size()) {
        word = "";
        return;
    }

    while (str[mv] == ' ')
        mv++;

    switch (str[mv]) {
        case '.':
            word = ".";
            break;
        case '#':
            word = "#";
            break;
        case '>':
            word = ">";
            break;
        case '(':
            word = "(";
            break;
        case ')':
            word = ")";
            break;
        case '*':
            word = "*";
            break;
        default:
            word = getword();
            break;
    }
    mv++;
}

void putstring (string name, VS setid, VS setclass) {
    cout << "<" << name;

    if (setid.size() != 0) {
        cout << " id=\"" << setid[0];
        for (int i = 1; i < setid.size(); i++)
            cout << " " << setid[i];
        cout << "\"";
    }

    if (setclass.size() != 0) {
        cout << " class=\"" << setclass[0];
        for (int i = 1; i < setclass.size(); i++)
            cout << " " << setclass[i];
        cout << "\"";
    }

    cout << ">";
}

void solve () {
    int ret = mv, x, y, ti = 1;
    string recstring = "";

    gettoken();
    while (word == "(") {
        solve();
        // now word is ")";
        gettoken(); // get a new token;
    }

    if (word == ">") { // after solve '()';
        solve();
        return;
    }

    if (word == "" || word == ")")
        return;

    string name;
    VS setclass, setid;

    while (true) {

        if (word == ".") {
            gettoken();
            setclass.push_back(word);
        } else if (word == "#") {
            gettoken();
            setid.push_back(word);
        } else if (word == ">") {
            putstring(name, setid, setclass);
            solve();
            break;
        } else if (word == ")" || word == "") {
            putstring(name, setid, setclass);
            break;
        } else if (word == "*") {
            x = mv - 1;
            gettoken();
            y = mv;
            ti = changeTonumber();
            for (int i = x; i < y; i++) {
                recstring += str[i];
                str[i] = ' ';
            }
        } else
            name = word;
        gettoken();
    }
    cout << "</" << name << ">";

    for (int i = 1; i < ti; i++) {
        mv = ret;
        solve();
    }

    for (int i = 0; i < recstring.size(); i++)
        str[i+x] = recstring[i];
}

int main () {
    int cas;
    cin >> cas;
    while (cas--) {
        cin >> str;
        mv = 0;
        solve();
        cout << endl;
    }
    return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116976.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基于Hmily实现TCC分布式事务解决方案[通俗易懂]

    基于Hmily实现TCC分布式事务解决方案[通俗易懂]前言在上一篇中,我们大致讲述了TCC事务的来源以及执行原理,并使用seata提供的解决方案完成了一个简单案例的整合与代码演示,本篇我们将采用Hmily的方式实现TCC事务的解决方案与演示业务描述有一个银行转账的场景,用户A需要向用户B转1块钱,如果大家使用的是同一个数据库,就不存在分布式事务的问题,现实中大家都各自使用自己的库,就产生了分布式事务可以理解为,两个账户分别在不同的银行(用户…

    2022年5月21日
    38
  • 云计算基础之如何学习云计算?

    背景随着云计算的普及,越来越多IDC上的网站与应用开始在云上。那么同时对于我们这些IT从业者来说,也面临着加快学习云计算,不被新技术淘汰的挑战。2011年,云计算正式开始发展。今年是2018年了,是云计算发展的第7个年头了。虽然云计算的前景很好,但它的发展也更多地是在商业应用上,还没能达到学习交流分享的层次。云计算的学习路线、书籍、社区与成熟的嵌入式、互联网行业相比,是非常欠缺的!我们这次…

    2022年4月4日
    34
  • VSCode安装教程(超详细)[通俗易懂]

    VSCode安装教程(超详细)[通俗易懂]VSCode安装教程(超详细)下载安装一、同意协议(废话了我)二、选择合适的安装位置,下一步三、下一步四、这里注意下,进行相关的选择五、点击安装六、等待安装完成,很快配置中文界面上面安装完成后会出现下面的界面,我们搜索Chinese,点击install然后Restart重启后就ok了,中文界面下载下载地址:DownloadVisualStudioCode选择相应的版本下载。安装跟着图一步步走,简单明了。一、同意协议(废话了我)二、选择合适的安装位置,下一步三、下一步四

    2022年8月22日
    7
  • shopee和lazada受欢迎程度_马六甲东南亚电商erp

    shopee和lazada受欢迎程度_马六甲东南亚电商erp电商运营,各平台有各平台的特征,各地区有各地区的不同,没有什么一招鲜的方法可以通杀全平台,所以运营这个系列,我们一定要从分析不同站点的特征和操盘方式来开头。这一篇文章一定要有一个前提条件:旨在给刚入行和准备转战本土店的中小卖家一个简单的指南。可以在起步阶段有所参考。站点本身没有好坏之分,任何一个市场,都会有人做得风生水起。闲话少叙,我们先单提出来一个,台湾站。shopee和lazada站点全解析台湾站台湾站是Shopee的市场,Lazada没有。从跨境转向本土的同学,肯定是对该站点最熟悉了。因为中国台湾站是

    2022年9月15日
    0
  • python中的换行符是什么_python的换行符是什么?_后端开发

    python中的换行符是什么_python的换行符是什么?_后端开发python换行符是什么?python换行符是“\n”。Windows换行符是’\r\n’,Unix/Linux的换行符为’\n’,Mac的换行符为’\r’,在python中,对换行符举行了一致处置惩罚,定义为“\n”。运用“\”举行换行输入:1、在python中,Python用反斜线(“\”)作为续行符(换行符),这里以python3.5为例。起首运转终端或许cmd敕令行(windows…

    2022年10月19日
    3
  • 1146 Topological Order「建议收藏」

    1146 Topological Order「建议收藏」题目题意:在给定有向图中,对于给定查询序列是否是有向图中的一个拓扑序列,记录非法序列下标tip:模拟拓扑排序#include<iostream>#include<vector>usingnamespacestd;intin_num[1003]={0};inttemp[1003]={0};vector<int>s[1003…

    2022年6月3日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号