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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • selenium用法详解【从入门到实战】【Python爬虫】【4万字】[通俗易懂]

    selenium用法详解【从入门到实战】【Python爬虫】【4万字】[通俗易懂]文章目录selenium简介selenium安装安装浏览器驱动确定浏览器版本下载驱动定位页面元素打开指定页面id定位name定位class定位tag定位xpath定位css定位link定位partial_link定位浏览器控制修改浏览器窗口大小浏览器前进&后退浏览器刷新浏览器窗口切换常见操作鼠标控制单击左键单击右键双击拖动鼠标悬停键盘控制设置元素等待显式等待隐式等待强制等待定位一组元素切换操作窗口切换表单切换弹窗处理上传&下载文件上传文件下载文件Chrome浏览器Fir

    2022年4月30日
    156
  • 字符串常量池深入解析[通俗易懂]

    字符串常量池深入解析[通俗易懂]字符串常量池字符串常量池概述一、Java中两种创建字符串对象的方式的分析。二、Intern的实现原理(JDK1.8)三、JDK1.7的Intern的执行四:几种特殊的情况的代码参考的部分文章概述  在分析字符串常量池之前,先来分析一下java的内存区域,然后再各种的情况分析一下各种情况下的情况;在《深入理解java虚拟机》这本书上是这样写的:对于H…

    2022年7月28日
    3
  • vue脚手架基本使用[通俗易懂]

    vue脚手架基本使用[通俗易懂]vue脚手架基本使用

    2022年4月22日
    63
  • netty 自定义协议_自定义annotation

    netty 自定义协议_自定义annotationNetty实现自定义协议

    2022年4月22日
    53
  • HandlerSocket简介及安装及卸载

    HandlerSocket简介及安装及卸载HandlerSocket是日本人akirahiguchi写的一个MySql的插件。通过这个插件,你可以直接跟MySQL后端的存储引擎做key-value式的交互,省去了MySQL上层的SQL解释、打开关闭表、创建查询计划等CPU开销。按照作者给出的数据可以在数据全部在内存的情况下可以达到75W的QPS查询。总之,它对mysql数据库的操作比mysql本身的操作语句快很多。  适用场景

    2022年8月24日
    7
  • centos部署ftp服务_文件服务器搭建

    centos部署ftp服务_文件服务器搭建Linux搭建FTP服务器步骤详解参考参考linux搭建FTP服务器

    2025年10月31日
    2

发表回复

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

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