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

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • unity3D场景_3D夜晚场景

    unity3D场景_3D夜晚场景在学习阿发你好的网课过程中,学习完Unity的2D课程后深有感触,决定将3D学习过程一步步记录下来,也方便日后查询。创建3D项目Step1:在UnityHub中新建3D项目Step2:将页面调整为2×3布局(项目中通常使用2×3)新建项目选择window->layouts->2by3选择window->General->Console调出控制台认识3D场景天空盒skybox:上有蓝天,下有深渊,在计算机图形学学习过程中就有所涉及。ALT+鼠标

  • 求生之路2机枪mod_求生之路2好看的枪械mod名字

    求生之路2机枪mod_求生之路2好看的枪械mod名字动态子弹(弹匣)数量修改工具:GCFScape、notepad++、vpk.exe自己在搜索引擎输入文件名找资源教程:教程均假设修改smg的静态子弹和动态子弹,其他枪械修改一样,只不过修改对象不同。1.先找出武器原始的数据文件(1).打开GCFScape,左上角File-open。找到“\Steam\SteamApps\common\Left4Dead2\left4dead…

    2022年10月29日
  • idea21.1 激活码-激活码分享

    (idea21.1 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • maven本地仓库默认路径_maven本地仓库

    maven本地仓库默认路径_maven本地仓库Maven配置本地仓库的路径1.打开maven安装路径\conf\settings.xml2.在50行左右有下面,默认位置在c盘用户下的/.m2/repository中<!–localRepository|Thepathtothelocalrepositorymavenwillusetostoreartifacts.||Defa…

  • windows 格式化磁盘_磁盘0没有初始化

    windows 格式化磁盘_磁盘0没有初始化#include”stdafx.h”#include”CMDiskManager.h”CMDiskManager::CMDiskManager(){}/*获取磁盘分区信息vDiskNo:磁盘序号*/DWORDCMDiskManager::GetLayoutInfo(DWORDvDiskNo){ chardiskPath[256]; //磁盘内部路径 //生成

  • 增加一行sql(多个左连接查询sql语句)

    sql左,右,内连接转载自:http://323229113.blog.163.com/blog/static/2185362820070172553209/感谢作者.相信做数据分析的朋友,对数据库都比较敏感,作为一名数据分析人员,我们处理数据时总会遇见各种各样的问题,包括连接方式的选择,今天和大家分享一下我眼里的左右连接和内连接的区别.原创博主文章中总结:左连接:保留左边全部行。按左…

发表回复

您的电子邮箱地址不会被公开。

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