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)


相关推荐

发表回复

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

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