【做题】sgu189 Perl-like Substr——dark模拟
注:这篇博客纯属为凑篇数而生。
题面较长,幸运的是,网上给出了相当不错的翻译。
需要支持的操作很简单,即对子串提取、赋值和输出,且对时间复杂度没有要求。换言之此题有成为块链毒瘤题的潜质。难点在于输入的格式是类似于源代码的,但形式单一,变量前均有$字符标注,可以通过直接判断来解决。于是就只需要大力讨论就可以了。
这或许就是所谓的题意即题解吧。
时间复杂度O(m*l)。
#include <bits/stdc++.h>
using namespace std;
const int N = , LN = ;
string var[N], tmp, tp;
int node[N * LN][], tag[N * LN], cnt, tot = , pos;
inline int read() {
int res = ; bool key = ;
for (; !(tmp[pos] >= '' && tmp[pos] <= '') ; ++ pos)
key = (tmp[pos] == '-');
for (; tmp[pos] >= '' && tmp[pos] <= '' ; ++ pos)
res = (res << ) + (res << ) + tmp[pos] - '';
if (key) res = - res;
return res;
}
inline int get_val(char x) {
if (x >= '' && x <= '') return x - '';
if (x >= 'a' && x <= 'z') return x - 'a' + ;
if (x >= 'A' && x <= 'Z') return x - 'A' + ;
return -;
}
inline bool invar(char x) {
return (x >= '' && x <= '') || (x >= 'a' && x <= 'z') || \
(x >= 'A' && x <= 'Z') || x == ' ' || x == ',' || x == '.' || \
x == '-' || x == '_' || x == ':' || x == '!' || x == '?';
}
int find(string s) {
int l = s.length(), p = , t;
for (int i = ; i < l ; ++ i) {
t = get_val(s[i]);
if (!node[p][t]) node[p][t] = ++ tot;
p = node[p][t];
}
if (!tag[p]) {
tag[p] = ++ cnt;
var[cnt] = "";
}
return tag[p];
}
int get_tag() {
tp = "";
while (~get_val(tmp[++ pos]))
tp += tmp[pos];
return find(tp);
}
void solve_init() {
int l = tmp.length(), p;
tp = "";
for (pos = ; pos < l ; ++ pos) {
if (tmp[pos] == '$') {
var[p = get_tag()] = "";
break;
}
}
while (tmp[pos] != '"') ++ pos;
for (++ pos ; invar(tmp[pos]) ; ++ pos) {
var[p] += tmp[pos];
}
}
void subst(int& p,int& l,int& n) {
while (tmp[pos] != '$') ++ pos;
p = get_tag();
int len = var[p].length(), be, co;
be = read();
while (tmp[pos] != ',' && tmp[pos] != ')') ++ pos;
if (tmp[pos] == ')') co = ;
else co = read();
l = be >= ? be : len + be;
n = co >= ? co > ? co : len - l : len + co - l;
while (tmp[pos] != ')') ++ pos;
++ pos;
}
void print() {
while (tmp[pos] != '$' && tmp[pos] != 's') ++ pos;
int p,l,n;
if (tmp[pos] == '$') {
p = get_tag();
cout << var[p] << endl;
} else {
subst(p,l,n);
cout << var[p].substr(l,n) << endl;
}
while (tmp[pos] != ')') ++ pos;
++ pos;
}
void solve() {
int l = tmp.length(), p1, p2, l1, n1, l2, n2, t1, t2;
for (pos = ; tmp[pos] == ' ' ; ++ pos);
switch(tmp[pos]) {
case 's':subst(p1,l1,n1), t1 = ; break;
case 'p':print(); return;
case '$':p1 = get_tag(), t1 = ; break;
}
for (; tmp[pos] != '$' && tmp[pos] != 's' ; ++ pos);
switch(tmp[pos]) {
case 's':subst(p2,l2,n2), t2 = ; break;
case '$':p2 = get_tag(), t2 = ; break;
}
if ((!t1) && (!t2)) var[p1] = var[p2];
else if ((!t1) && t2) var[p1] = var[p2].substr(l2,n2);
else if (t1 && (!t2)) var[p1].replace(l1,n1,var[p2]);
else if (t1 && t2) var[p1].replace(l1,n1,var[p2],l2,n2);
}
int main() {
int n,m;
scanf("%d%d\n",&n,&m);
for (int i = ; i <= n ; ++ i) {
getline(cin,tmp);
solve_init();
}
for (int i = ; i <= m ; ++ i) {
getline(cin,tmp);
solve();
}
return ;
}
小结:续了一个下午……代码能力不够的问题。
【做题】sgu189 Perl-like Substr——dark模拟的更多相关文章
- 洛谷P3926 SAC E#1 - 一道不可做题 Jelly【模拟/细节】
P3926 SAC E#1 - 一道不可做题 Jelly [链接]:https://www.luogu.org/problem/show?pid=3926 题目背景 SOL君(炉石主播)和SOL菌(完 ...
- 为Dark模拟做出的一些微小的贡献
这几周经过liners大佬的指导,发现自己的代码实现能力确实太过于垃圾,所以根据他的指示,我应该去多多练习一下Dark模拟,但是最近刚刚入手Dark模拟的我感到非常的吃力,所以本人今天写博客一篇来讲述 ...
- [日记&做题记录]-Noip2016提高组复赛 倒数十天
写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...
- noip做题记录+挑战一句话题解?
因为灵巧实在太弱辽不得不做点noip续下命QQAQQQ 2018 积木大赛/铺设道路 傻逼原题? 然后傻逼的我居然检查了半天是不是有陷阱最后花了差不多一个小时才做掉我做过的原题...真的傻逼了我:( ...
- BZOJ做题记录[0512~?]
觉得做一道开一篇真不好...好多想找的东西都被刷下去了... 至于?的日期究竟到什么时候...还是看心情...但是估计不会超过七天吧 最后更新时间:05/19 10:42 [05/14 10:56]我 ...
- Sam做题记录
Sam做题记录 Hihocoder 后缀自动机二·重复旋律5 求一个串中本质不同的子串数 显然,答案是 \(\sum len[i]-len[fa[i]]\) Hihocoder 后缀自动机三·重复旋律 ...
- l洛谷 P3926 SAC E#1 - 一道不可做题 Jelly
P3926 SAC E#1 - 一道不可做题 Jelly 题目背景 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢吃蒟蒻果冻.而SOL菌也很喜欢蒟蒻果冻. 有一 ...
- 退役III次后做题记录(扯淡)
退役III次后做题记录(扯淡) CF607E Cross Sum 计算几何屎题 直接二分一下,算出每条线的位置然后算 注意相对位置这个不能先搞出坐标,直接算角度就行了,不然会卡精度/px flag:计 ...
- 退役II次后做题记录
退役II次后做题记录 感觉没啥好更的,咕. atcoder1219 历史研究 回滚莫队. [六省联考2017]组合数问题 我是傻逼 按照组合意义等价于\(nk\)个物品,选的物品\(\mod k\) ...
随机推荐
- linux命令目录
一.文件和目录.(文件目录的增删改查) ls pwd cd mkdir touch rmdir ln dd rm cp mv nl cat tac more less head tail stat # ...
- Vim 文本编辑器的基本使用
Vim文本编辑器是Linux/Unix系统下最常用的工具之一,通过该工具可以很方便的建立.修改.编辑文档或者程序文件,其作用类似与windows系统下的记事本或者notepad++,因此熟练掌握该工具 ...
- Windows以及Linux系统文件、文件夹命名规则
在实际开发中又是会碰到"文件名.目录名或卷标语法不正确."这样的错误信息,基本就是由于文件命名出现问题. 在Windows下: 1.文件名或文件夹名可以由1-256个西文字符或12 ...
- <转>jmeter(十)参数化
本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...
- Elasticsearch集群内的原理
一个运行中的 Elasticsearch 实例称为一个 节点,而集群是由一个或者多个拥有相同 cluster.name 配置的节点组成, 它们共同承担数据和负载的压力.当有节点加入集群中或者从 ...
- Win10+Ubuntu16.04双系统安装过程中遇到的一些问题及解决办法
前两天闲来无聊重装了系统,装的是win10 64的系统,后来心血来潮索性再装Ubuntu,搞成win10+Ubuntu双系统. win10系统的镜像文件可以通过MSDN网站获取,MSDN是一个很可靠的 ...
- Oracle误删除数据恢复
select * from tablename as of timestamp to_timestamp('2018-05-04 13:30:00','yyyy-MM-dd hh24:mi:ss') ...
- Linux笔记 #08# shell编程从零开始到低配学生管理系统
先熟悉一下基本语法(运行环境是装git的时候一起装的那个windows下的bash): #!/bin/bash # 实现两个函数 # appendToFile()追加一行到文件 # readFile( ...
- php 网站中文简体繁体转换类
php 网站中文简体繁体转换类 <?php /* * define zh convert functions * 2017-4-28 use str_replace for speed * zh ...
- How to Conduct High-Impact Research and Produce High-Quality Papers
How to Conduct High-Impact Research and Produce High-Quality Papers Contents From Slide Russell Grou ...