[2014 Regional]牡丹江 H Hierarchical Notation 做题记录
主妇:老年人谁是炮灰牡丹江,我们的团队只是做同步大赛
他决定开爆震H什么时候,A 5min 1Y。I在该限制后,纠结了很久30min+ 1Y,神继续承担各种位置卡D在,hpp见B我认为这是非常熟悉的研究ing
告诉我,然后看积分榜,并且K和H。
K想叫队友一起想一下(毕竟过的人非常多了),可是不好意思叫。然后看H,非常有一种XML那种树形数据描写叙述结构的味道。可是语法简单太多了(好像不应该扯XML的……)
感觉上是一个中难偏简单的模拟,于是就開始考虑怎么实现好了。
估算一下字符串长度,10000冒号*2个描写叙述字符串*每一个描写叙述串22个字符。再满打满算算上10000对花括号、10000个逗号,500000大的char[]够了吧?
然后详细处理的时候,我的第一反应是,写个kmp,然后分段在我所给定的区间找,找到输出相应的value,找不到输出Error
熊神听到我的想法一票否决,500000*1000怎么算都认为挺作死的……
熊神提出一种想法。用map呗。假设value还是EON就指向还有一个map。
好吧,那继续想怎么写程序(这个时候熊神找到了正确的D的姿势,交上去1Y)。想了想。结构体我又来了……
整体思路:一对Key-Value对为一个node。node里面记录value在原串里面的開始和结束位置(不要复制字符串,非常糟糕的情况下会爆内存的),还要区分两种类型,一种是直接文本的value。还有一种是一个EON。那要指向一个map 。
花括号嵌套的时候,用手工栈记录如今是在往哪个map里增加Key-Value对。
然后就啪嗒啪嗒啪嗒的敲啊敲啊敲啊……
第一次交上去RE,细致一看。map没初始化好。改了再交,还是RE
好吧,于是開始了造数据——毕竟sample弱啊
{"hm":"Edward","stu":{"stu01":"Alice","stu02":"Bob"},"stu01":"aaa"}
5
"hm"
"stu"
"stu"."stu01"
"stu01"
"students"
{"hm":"Edward","stu":{"stus":{"stu01":"Alice","stu02":"Bob"}},"name":"school"}
5
"hm"
"stu"
"stu"."stu01"
"stu"."stus"
"name"
然后果然压中了……
}},这里的处理没处理好,改一下,然后就3Y了
只是老实说。我写了137行的代码也是醉了……
熊神表示,实际赛场上绝对是他去写递归下降了……
下面是代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
#include <iostream>
#include <map>
#include <string>
#include <algorithm>
using namespace std; char str[500005];
char query[500005];
map<string,int> ms[10005];
char tmp[2000]; struct Node
{
int type;
int sp,ep;
int mapid;
void showme()
{
for(int i=sp;i<=ep;i++)
printf("%c",str[i]);
puts("");
}
}node[10005]; int phrase(char *str,int &p)
{
int idx=0;
do
{
tmp[idx++]=str[p];
p++;
}while(str[p]!='"');
tmp[idx++]='"';
tmp[idx++]='\0';
p++;
return idx;
} int findbrac(int p)
{
int lbrac=0;
for(int i=p;;i++)
{
if(str[i]=='{')
lbrac++;
else if(str[i]=='}')
lbrac--;
if(lbrac==0)
return i;
}
} int stack[10005]; int main()
{
int T;
for(scanf("%d%*c",&T);T--;)
{
gets(str);
for(int i=0;i<=10001;i++)
ms[i].clear();
int len=strlen(str),stop=0,mcnt=1;
int ncnt=1,p=1;
stack[0]=0;
for(;p<len-1;p++)
{
if(str[p]==',')continue;
if(str[p]=='}')
{
stop--;
continue;
}
phrase(str,p);
p++;
if(str[p]=='"')
{
node[ncnt].type=0;
node[ncnt].sp=p;
ms[stack[stop]][tmp]=ncnt;
phrase(str,p);
node[ncnt].ep=p-1;
ncnt++;
}
else
{
node[ncnt].type=1;
node[ncnt].sp=p;
node[ncnt].ep=findbrac(p);
node[ncnt].mapid=mcnt++;
ms[stack[stop]][tmp]=ncnt;
stop++;
stack[stop]=node[ncnt].mapid;
ncnt++;
}
if(str[p]=='}')
stop--;
}
int Q;
for(scanf("%d%*c",&Q);Q--;)
{
gets(query);
int ctmap=0,p=0,len=strlen(query);
for(;p<len;p++)
{
phrase(query,p);
map<string,int>::iterator it=ms[ctmap].find(tmp);
if(it==ms[ctmap].end())
{
puts("Error!");
break;
}
int nid=it->second;
if(query[p]=='.'&&node[nid].type!=1)
{
puts("Error!");
break;
}
if(query[p]=='.')
{
ctmap=node[nid].mapid;
}
else
{
node[nid].showme();
break;
}
}
}
}
return 0;
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
[2014 Regional]牡丹江 H Hierarchical Notation 做题记录的更多相关文章
- 退役IV次后做题记录
退役IV次后做题记录 我啥都不会了.... AGC023 D 如果所有的楼房都在\(S\)同一边可以直接得出答案. 否则考虑最左最右两边的票数,如果左边>=右边,那么最右边会投给左边,因为就算车 ...
- UOJ 做题记录
UOJ 做题记录 其实我这么弱> >根本不会做题呢> > #21. [UR #1]缩进优化 其实想想还是一道非常丝播的题目呢> > 直接对于每个缩进长度统计一遍就好 ...
- project euler做题记录
ProjectEuler_做题记录 简单记录一下. problem 441 The inverse summation of coprime couples 神仙题.考虑答案为: \[\begin{a ...
- Sam做题记录
Sam做题记录 Hihocoder 后缀自动机二·重复旋律5 求一个串中本质不同的子串数 显然,答案是 \(\sum len[i]-len[fa[i]]\) Hihocoder 后缀自动机三·重复旋律 ...
- 退役III次后做题记录(扯淡)
退役III次后做题记录(扯淡) CF607E Cross Sum 计算几何屎题 直接二分一下,算出每条线的位置然后算 注意相对位置这个不能先搞出坐标,直接算角度就行了,不然会卡精度/px flag:计 ...
- 退役II次后做题记录
退役II次后做题记录 感觉没啥好更的,咕. atcoder1219 历史研究 回滚莫队. [六省联考2017]组合数问题 我是傻逼 按照组合意义等价于\(nk\)个物品,选的物品\(\mod k\) ...
- BJOI做题记录
BJOI做题记录 终于想起还要做一下历年省选题了2333 然而咕了的还是比做了的多2333 LOJ #2178. 「BJOI2017」机动训练 咕了. LOJ #2179. 「BJOI2017」树的难 ...
- FJOI2017前做题记录
FJOI2017前做题记录 2017-04-15 [ZJOI2017] 树状数组 问题转化后,变成区间随机将一个数异或一,询问两个位置的值相等的概率.(注意特判询问有一个区间的左端点为1的情况,因为题 ...
- noip做题记录+挑战一句话题解?
因为灵巧实在太弱辽不得不做点noip续下命QQAQQQ 2018 积木大赛/铺设道路 傻逼原题? 然后傻逼的我居然检查了半天是不是有陷阱最后花了差不多一个小时才做掉我做过的原题...真的傻逼了我:( ...
随机推荐
- 框架学习之道:PE框架简介
1.PE框架开发新功能所需的部分 2.PE框架工作流程(重要) 首先根据<transcation>中的id号,找到模板(template),然后再根据模板找到责任链(chain),一旦确认 ...
- bunoj 34990(hash)
传送门:Justice String 题意:有两个串A,B,问是否存在A的一个子串S,S和B的长度相等,最多有2个字符不同.如果有多个,输出其实下标最小S的下标,没有输出-1. 分析:从A每个位置开始 ...
- Android架构设计和软硬整合完整训练
Android架构设计和软硬整合完整训练 Android架构设计和软硬整合完整训练:HAL&Framework&Native Service&Android Service&a ...
- OCP读书笔记(4) - 配置备份设置
4.Configuring Backup Settings 查看RMAN持久化设置 [oracle@easthome ~]$ rman target / RMAN> show all; SQL& ...
- leetcode回文子串拆分-最小拆分次数
转载请注明来自souldak,微博:@evagle 上一篇是要输出所有的可能拆分,这回是要输出拆分次数最少的切割次数. 如果直接按照上一篇那么做的话,就会超时,因为我们在判断s[i][j]是否是回文的 ...
- loj1201(最大独立集)
传送门:A Perfect Murder 题意:有一群苍蝇,之间有一些是朋友关系,如果杀了一只苍蝇,那么它的朋友们都会有警惕性,再也杀不了这些朋友了,问最多能杀多少只苍蝇. 分析:根据朋友性连边,最多 ...
- 从零開始学习制作H5应用——V5.0:懊悔机制,整理文件夹,压缩,模板化
经过前面四个版本号的迭代.我们已经制作了一个从视觉和听觉上都非常舒服的H5微场景应用,没有看过的请戳以下: V1.0--简单页面滑动切换 V2.0--多页切换.透明过渡及交互指示 V3.0--增加lo ...
- 在Mybatis中使用注解@多个參数查询
@Select("SELECT * FROM wc_homework WHERE organization_id=#{classId} ORDER BY createtime DESC LI ...
- BZOJ 1324 Exca 神剑 最小割
标题效果:鉴于加权值矩阵,带走一个地方的权利值之后,与其相邻的格儿童权利值变0.问多少可以取出到右值. 思维:Amber论文题目.不难建设,图着色.颜色从S连边,还有一种颜色向T连边.再把相邻的格子连 ...
- 使用javaDate类代数据仓库维度表
使用javaDate类代数据仓库维度表 Date类别: ,返回一个相对日期的毫秒数.精确到毫秒.但不支持日期的国际化和分时区显示. Date 类从Java 开发包(JDK)1.0 就開始进化,当时它仅 ...