HDU 4964 Emmet --模拟
题意:给你一个字符串,要求把它按语法转化成HTML格式。
分析:这题其实不难,就是一个递归的事情,当时忽略了括号嵌套的情况,所以一直WA,后来加上这种情况后就过了。简直醉了。
处理id和class时,在一个'>'内,先把遇到的id和class都push到一个容器中,然后再输出即可。
这题要注意的地方: 1.括号以及括号嵌套 2.好像没了
代码有点长,将就看吧。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
using namespace std; string S; inline int StoNum(string str)
{
int num = atoi(str.c_str());
return num;
} void print(int u,int v)
{
int i;
if(u >= v)
return;
for(i=u;i<v;i++)
{
if(S[i] == '>')
break;
}
int endi,sta = u;
if(i == v) endi = v;
else endi = i;
if(S[u] == '(')
{
int cnt = ;
for(i=u+;i<v;i++)
{
if(S[i] == ')' && cnt == ) break;
else if(S[i] == ')') cnt--;
else if(S[i] == '(') cnt++;
}
sta = u+;
endi = i;
print(sta,endi);
print(endi+,v);
return;
}
int flag = ; // 0:div 1:id 2:class 3:multi
string divi = "",classi = "",idd = "",multi = "";
vector<string> cls,id;
cls.clear(),id.clear();
vector<pair<int,int> > kuo;
kuo.clear();
for(i=sta;i<endi;i++)
{
if(S[i] != '#' && S[i] != '*' && S[i] != '.' && S[i] != '(')
{
if(flag == ) divi += S[i];
else if(flag == ) idd += S[i];
else if(flag == ) classi += S[i];
else if(flag == ) multi += S[i];
}
else if(S[i] == '#') // 0:div 1:id 2:class 3:multi
{
if(flag == )
{
id.push_back(idd);
idd = "";
}
else if(flag == )
{
cls.push_back(classi);
classi = "";
}
flag = ;
}
else if(S[i] == '.')
{
if(flag == )
{
id.push_back(idd);
idd = "";
}
else if(flag == )
{
cls.push_back(classi);
classi = "";
}
flag = ;
}
else if(S[i] == '*')
{
if(flag == )
{
id.push_back(idd);
idd = "";
}
else if(flag == )
{
cls.push_back(classi);
classi = "";
}
flag = ;
multi = "";
}
else if(S[i] == '(')
{
int now;
int cnt = ;
for(now=i+;now<endi;now++)
{
if(S[now] == ')' && cnt == ) break;
else if(S[now] == ')') cnt--;
else if(S[now] == '(') cnt++;
}
kuo.push_back(make_pair(i+,now));
i = now;
}
}
if(idd != "")
id.push_back(idd);
if(classi != "")
cls.push_back(classi);
int num = ;
if(multi != "")
num = StoNum(multi);
for(int k=;k<num;k++)
{
cout<<"<"<<divi;
if(id.size() != || cls.size() != )
cout<<" ";
if(id.size())
{
cout<<"id=\"";
cout<<id[];
for(i=;i<id.size();i++)
cout<<" "<<id[i];
cout<<"\"";
}
if(cls.size())
{
if(id.size())
cout<<" ";
cout<<"class=\"";
cout<<cls[];
for(i=;i<cls.size();i++)
cout<<" "<<cls[i];
cout<<"\"";
}
cout<<">";
if(kuo.size())
{
for(i=;i<kuo.size();i++)
print(kuo[i].first,kuo[i].second);
}
print(endi+,v);
cout<<"</"<<divi<<">";
}
} int main()
{
int n;
scanf("%d",&n);
while(n--)
{
cin>>S;
print(,S.length());
puts("");
}
return ;
}
HDU 4964 Emmet --模拟的更多相关文章
- hdu 4964 恶心模拟
http://acm.hdu.edu.cn/showproblem.php?pid=4964 给定语句,按照语法翻译html并输出. 就是恶心的模拟,递归搞就行了 处理id和class时,在一个'&g ...
- HDU 4121 Xiangqi 模拟题
Xiangqi Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4121 ...
- hdu 5071 Chat(模拟)
题目链接:hdu 5071 Chat 题目大意:模拟题. .. 注意最后说bye的时候仅仅要和讲过话的妹子说再见. 解题思路:用一个map记录每一个等级的妹子讲过多少话以及是否有这个等级的妹子.数组A ...
- hdu 4740【模拟+深搜】.cpp
题意: 给出老虎的起始点.方向和驴的起始点.方向.. 规定老虎和驴都不会走自己走过的方格,并且当没路走的时候,驴会右转,老虎会左转.. 当转了一次还没路走就会停下来.. 问他们有没有可能在某一格相遇. ...
- HDU 2568[前进]模拟
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2568 关键思想:傻傻地模拟 代码如下: #include<iostream> using ...
- HDU 5965 枚举模拟 + dp(?)
ccpc合肥站的重现...一看就觉得是dp 然后强行搞出来一个转移方程 即 根据第i-1列的需求和i-1 i-2列的枚举摆放 可以得出i列摆放的种类..加了n多if语句...最后感觉怎么都能过了..然 ...
- HDU 5083 Instruction --模拟
题意:给出汇编指令,解释出编码或者给出编码,解释出汇编指令. 解法:简单模拟,按照给出的规则一步一步来就好了,主要是注意“SET”的情况,还有要输出的东西最好放到最后一起输出,中间如果一旦不对就可以及 ...
- HDU 1707 简单模拟 Spring-outing Decision
Spring-outing Decision Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- HDU 5918 KMP/模拟
Sequence I Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
随机推荐
- Struts2中 Result类型配置详解
一个result代表了一个可能的输出.当Action类的方法执行完成时,它返回一个字符串类型的结果码,框架根据这个结果码选择对应的result,向用户输出.在com.opensymphony.xwor ...
- R语言-神经网络包RSNNS
code{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && docu ...
- svn的管理与维护要点—纯手工编写
由于在公司要维护阿里云的linux服务器,我们的svn服务器就安在阿里云上面.所以经常会涉及到svn的维护操作.离职的时候编写交接文档,刚好有充足的时间写一篇说明介绍,此说明纯原创,不是从网上复制,手 ...
- SQL Server Insert时开启显式事务
如果没法避免一条一条的写入,那么在处理前显示开启一个事务 begin tran 在处理完成后 commit 这样也要比不开显示事务会快很多! while i < 10000begin inse ...
- IOS6学习笔记(四)
1.GCD设置一个timer计时器 - (void)awakeFromNib { __weak id weakSelf = self; double delayInSeconds = 0.25; _t ...
- JS-取出字符串中重复次数最多的字符并输出
/** 取出字符串中重复字数最多的字符 */ var words = 'sdfghjkfastgbyhnvdstyaujskgfdfhlaa'; //创建字符串 var word, //单个字符 le ...
- C# 线程同步
Mutex 类 使用Mutex类来同步两个单独的程序.Mutex是一种原始的同步方式,其只对一个线程授予对共享资源的独占访问. const string NutexName = "C&quo ...
- andriod 带看括弧的计算器
界面 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=& ...
- CoreAnimation-04-核心动画必备基础
概述 简介 核心动画提供了一组非常强大的动画API,通过该组API可以高效的实现绝大部分绚丽的动画效果 注意事项 核心动画的操作在子线程中执行,不会阻塞主线程 核心动画直接作用与CALayer对象上, ...
- 怎样查看linux版本
玩一台新的linux服务器,首先要做的,就是先看下是什么版本的系统: 命令如下: 登录到linux执行cat /etc/redhat-release ,例如如下: [root@3.5.5Biz-46 ...