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


相关推荐

  • vue的mixins的使用[通俗易懂]

    vue的mixins的使用[通俗易懂]mixins就是混入。一个混入对象可以包含任意组件选项。同一个生命周期,混入对象会比组件的先执行。1.创建一个test.js,用export暴露出mixins对象2.在组件中引入这个mixin

    2022年8月5日
    2
  • linux开启ssh命令(linux开启端口命令)

    在使用SSH时,经常会出现用sshsecureshellclient连接linux连接不上:解决方法如下: 如果没安装ssh,其安装过程:1.以root身份登入系统(没登入系统和没有足够的权限都不能安装,晕,这不是废话)2.检查安装系统时是否已经安装SSH服务端软件包: rpm-qa|grepopenssh 若显示结果中包含openssh-serve

    2022年4月14日
    380
  • 熊猫烧香病毒分析报告

    熊猫烧香病毒分析报告1.样本概况1.1样本信息(1)病毒名称:spo0lsv.exe(2)所属家族:熊猫烧香(3)MD5值:B8F8E75C9E77743A61BBEA9CCBCFFD5D(4)SHA1值:188FC8FC580C0EA4BF8A8900A3D36471823C8923(5)CRC32:E63D45D3(6)病毒行为:复制自身到系统目录下设置文件属性为隐藏,并且让…

    2022年10月24日
    0
  • html+CSS让背景图片充满整个屏幕

    html+CSS让背景图片充满整个屏幕由于给网页设置背景图时,需要设置背景图不重复且充满整个浏览器屏幕。   给body标签指定背景图,这样背景图就可以填充整个浏览器viewport了。其实,该方案对所有的块级容器都可以生效。块级容器的宽高是动态的,那么背景图将自动伸缩,充满整个容器。可设置body标签的CSS样式如下:body{/*加载背景图*/backg

    2022年6月7日
    27
  • 20190505

    20190505

    2021年7月6日
    92
  • 用Pycharm 直接下载Pyinstaller,以及使用问题解决

    用Pycharm 直接下载Pyinstaller,以及使用问题解决作为一个学语言学着玩的人,肯定很想把自己的学py文件打包发给别人,Pyinstaller包满足你。因为我一般下载包都是通过Pycharm下载的,有两个方法:一:在Pycharm中你输入:importPyinstaller#会报错只需要按住alt+回车下面就会出现是否安转此包,再回车一下等待就会自动安转完成;二:在Pycharm左上角的File->Setti…

    2022年8月26日
    9

发表回复

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

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