递归语法翻译。。。

Emmet

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)

Total Submission(s): 138    Accepted Submission(s): 44

Problem Description
For every programmer, coding HTML & CSS is a very boring thing.



For example, writing an html tag <div> with id "div1" and class "col-md-3", you must write an html file like this:



    <div id = "div1" class = "col3">

    ...

    </div>

Too much unnecessary coding!!!



For convenience, some Web programmer develop a vim plugin -- Emmet. By this tool, the programmer just need code "div#div1.col3" and then Emmet would transform it to "<div id = "div1" class = "col3"></div>". It is very coollllll! Now you task is to write a program
to perform this transformation.



Here are more details about you task:



1.Handle multilevel tag.

  "div>p>span" means there are 3 tags and tag <p> is in the tag "div", tag <span> is in the tag "p".

  So, the right answer is "<div><p><span></span></p></div>"



2.  Every tag may have zero or one id and any amount of classes.

  A string (only consisting of letters and digits) after '#' is an id name.

  A string (only consisting of letters and digits) after '.' is a class name.

  If a tag has id and classes at the same time, you must output the id first.

  If a tag has more than one class, you must output them by the order according to the input.

  For example

  "div.aa#bb.cc.ee>p#g>span.d" =>

  <div id="bb" class="aa cc ee">

    <p id="g">

      <span class="d"></span>

    </p>

  </div>"



3.Handle parentheses.

  Use parentheses to deal with sibling relation among tags!

  For example

  <div id="bb" class="aa cc ee">

    <p id="g1"><span class="d1"></span></p>

    <p id="g2"><span class="d2"></span></p>

    <p id="g3"><span class="d3"></span></p>

  </div>

  can be obtained by "div.aa#bb.cc.ee>(p#g1>span.d1)(p#g2>span.d2)(p#g3>span.d3)"

  If the input string contains parentheses, the rightmost ‘)’ will be the last character of this string.



4.Handle symbol ‘*’

At the end of a tag, you may see a suffix "*%d". It indicates that this tag would be repeated "%d" times.

  For example

  ul#id1>li.classA*3>p*2 =>

  <ul id="id1">

    <li class="classA">

      <p></p>

      <p></p>

    </li>

    <li class="classA">

      <p></p>

      <p></p>

    </li>

    <li class="classA">

      <p></p>

      <p></p>

    </li>

  </ul>
 
Input
The first line of input contains an integer N (N<=50), indicating the number of strings you need to transform.



The following N lines, each consists of an input string. No string has more than 120 chars and the result would not have more than 1000 chars. Tag name, class name and id only contain English letters and digits. It is guaranteed that the input string is valid.
 
Output
Output N lines each consisting of a string that is the result of the transformation. More details about the output format can be seen from the sample output. You should follow the output format strictly. No extra space or new line character is allowed in the
output.
 
Sample Input
4
div>p>span
div.aa#bb.cc.ee>p#g>span.d
div.aa#bb.cc.ee>(p#g1>span.d1)(p#g2>span.d2)(p#g3>span.d3)
ul#id1>li.classA*3>p*2
 
Sample Output
<div><p><span></span></p></div>
<div id="bb" class="aa cc ee"><p id="g"><span class="d"></span></p></div>
<div id="bb" class="aa cc ee"><p id="g1"><span class="d1"></span></p><p id="g2"><span class="d2"></span></p><p id="g3"><span class="d3"></span></p></div>
<ul id="id1"><li class="classA"><p></p><p></p></li><li class="classA"><p></p><p></p></li><li class="classA"><p></p><p></p></li></ul>
 
Author
SYSU
 
Source
 

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <string> using namespace std; struct Node
{
string head,context,end;
void Uion(Node a)
{
context=a.head+a.context+a.end;
}
}; string cmd,ans; Node get_Node(int l,int r)
{
string name="",id="",cls="";
int i;
for(i=l;i<=r;i++)
{
if(cmd[i]=='.'||cmd[i]=='#'||cmd[i]=='*') break;
name+=cmd[i];
}
while(i<=r)
{
if(cmd[i]=='*') break;
if(cmd[i]=='.')
{
i++;
if(cls.length()) cls+=" ";
for(;i<=r;i++)
{
if(cmd[i]=='.'||cmd[i]=='#'||cmd[i]=='*') break;
cls+=cmd[i];
}
}
else if(cmd[i]=='#')
{
i++;
if(id.length()) id+=" ";
for(;i<=r;i++)
{
if(cmd[i]=='.'||cmd[i]=='#'||cmd[i]=='*') break;
id+=cmd[i];
}
}
}
Node ret;
ret.head="<"+name;
if(id.length()) ret.head+=" id=\""+id+"\"";
if(cls.length()) ret.head+=" class=\""+cls+"\"";
ret.head+=">";
ret.end="</"+name+">";
return ret;
} int get_num(int L,int R)
{
int i,ret=0;
for(i=L;i<=R;i++)
{
if(cmd[i]=='*') break;
}
i++;
for(;i<=R;i++)
{
ret=ret*10+cmd[i]-'0';
}
return ret;
} Node get_cmd(int L,int R)
{
Node ans;
if(L>R) return ans;
if(cmd[L]!='(')
{
int r=L;
while(r<=R&&cmd[r]!='>')
r++;
int num=get_num(L,r-1);
ans=get_Node(L,r-1); Node temp=get_cmd(r+1,R); ans.Uion(temp);
if(num>1)
{
string loop=ans.context;
for(int i=1;i<num;i++)
{
loop+=ans.end+ans.head+ans.context;
}
ans.context=loop;
}
}
else
{
int sum=0,last=L;
for(int i=L;i<=R;i++)
{
if(cmd[i]=='(') sum++;
else if(cmd[i]==')') sum--;
if(sum==0)
{
Node temp=get_cmd(last+1,i-1);
last=i+1;
if(ans.head.length()==0)
{
ans=temp;
}
else
{
ans.context+=ans.end+temp.head+temp.context;
ans.end=temp.end;
}
}
}
}
return ans;
} int main()
{
int T_T;
scanf("%d",&T_T);
while(T_T--)
{
cin>>cmd;
int len=cmd.length();
Node ans=get_cmd(0,len-1);
cout<<ans.head<<ans.context<<ans.end<<endl;
}
return 0;
}

HDOJ 4964 Emmet的更多相关文章

  1. HDU 4964 Emmet --模拟

    题意:给你一个字符串,要求把它按语法转化成HTML格式. 分析:这题其实不难,就是一个递归的事情,当时忽略了括号嵌套的情况,所以一直WA,后来加上这种情况后就过了.简直醉了. 处理id和class时, ...

  2. emmet,jade,haml, slim,less,sass,coffeescript等的实战优缺点

    摘要: 文章背景,来自于群内周五晚上的一次头脑风暴式的思维碰撞交流活动. 随着前端技术的蓬勃发展, 各种新技术随着生产力的需要不断的涌入我们的视野, 那今天探讨的话题是这些新时代的前端兵器谱: 一. ...

  3. emmet 系列(1)基础语法

    emmet 系列(1)基础语法 emmet 是一个能显著提升开发html和css开发效率的web开发者工具 emmet基本上目前已知的编辑器都有相应的插件,各个编辑器的emmet插件的下载地址:点我下 ...

  4. 前端开发必备!Emmet使用手册

    介绍 Emmet (前身为 Zen Coding) 是一个能大幅度提高前端开发效率的一个工具: 基本上,大多数的文本编辑器都会允许你存储和重用一些代码块,我们称之为"片段".虽然片 ...

  5. HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  6. HDOJ 2317. Nasty Hacks 模拟水题

    Nasty Hacks Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  7. HDOJ 1326. Box of Bricks 纯水题

    Box of Bricks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  8. emmet的使用

    http://blog.wpjam.com/m/emmet-grammar/ 使用 Emmet 生成 HTML 的语法详解 开源程序 浏览:21537 2013年05月09日 文章目录[隐藏] 生成 ...

  9. Sublime Text 3 Emmet插件安装

    一.手动安装:   1. Emmet (ex-Zen Coding) for Sublime Text  http://emmet.io (1) 下载:https://github.com/serge ...

随机推荐

  1. 再淡spring jdbc 连接池断开重连设置

    先看一段错误日志: ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConne ...

  2. tcp接收xml数据解析

    避免tcp接收xml数据时加上xml数据长度,根据xml数据特点来解析recv到的xml数据 int nPos1 = 0; int nPos2 = 0; int nTempPos = 0; int n ...

  3. RHEL Server 6.3下MySQL5.5.25a源码安装

    OS:RHEL Server 6.3 MySQL:mysql-5.5.25a.tar.gz 相关依赖包: ncurses-5.9.tar.gz bison-2.5.tar.gz 安装MySQL 一.安 ...

  4. ASP.NET - 编写让别人能读懂的代码

    http://www.cnblogs.com/richieyang/p/4840614.html

  5. linux命令:echo

    echo $SHELL ----> /usr/bin/tcsh echo $ARBORDIR ----> /export/home/arbsfr/SFR_ENTREPRISE/SFRE3

  6. 能够返回运行结果的system函数加强版本号

    /*********************************************************************  * Author  : Samson  * Date   ...

  7. Sencha Touch 2 在MAC下详细的开发流程

    在不久的将来我相信Web App会流行的非常广, 能看到未来才能主宰未来.对于我们开发人员来说我觉得想成就一件伟大的事情,需要过硬的技术和好的想法,再加上决不放弃的精神,一定可以成功的. 以下在Mac ...

  8. POJ2782:Bin Packing

    Description   A set of n<tex2html_verbatim_mark> 1-dimensional items have to be packed in iden ...

  9. Android 环境变量配置(Mac)

    Mac 系统10.10,自带的就是jdk1.6,因为工作需要就升级到了1.7,要从新配置环境变量了 mac 默认是自带的有jdk1.6 安装路径为: /System/Library/Framework ...

  10. Servlet过滤器——日志记录过滤器

    1.概述 在实际的项目开发过程中,经常需要在项目运行时,记录并在控制台中输出运行时的日志信息,便于查看项目的运行状况.本实例将介绍如何应用过滤器实现日志记录.运行本实例,将在控制台中输出项目运行时的日 ...