注:这篇博客纯属为凑篇数而生。

题面较长,幸运的是,网上给出了相当不错的翻译

需要支持的操作很简单,即对子串提取、赋值和输出,且对时间复杂度没有要求。换言之此题有成为块链毒瘤题的潜质。难点在于输入的格式是类似于源代码的,但形式单一,变量前均有$字符标注,可以通过直接判断来解决。于是就只需要大力讨论就可以了。

这或许就是所谓的题意即题解吧。

时间复杂度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模拟的更多相关文章

  1. 洛谷P3926 SAC E#1 - 一道不可做题 Jelly【模拟/细节】

    P3926 SAC E#1 - 一道不可做题 Jelly [链接]:https://www.luogu.org/problem/show?pid=3926 题目背景 SOL君(炉石主播)和SOL菌(完 ...

  2. 为Dark模拟做出的一些微小的贡献

    这几周经过liners大佬的指导,发现自己的代码实现能力确实太过于垃圾,所以根据他的指示,我应该去多多练习一下Dark模拟,但是最近刚刚入手Dark模拟的我感到非常的吃力,所以本人今天写博客一篇来讲述 ...

  3. [日记&做题记录]-Noip2016提高组复赛 倒数十天

    写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...

  4. noip做题记录+挑战一句话题解?

    因为灵巧实在太弱辽不得不做点noip续下命QQAQQQ 2018 积木大赛/铺设道路 傻逼原题? 然后傻逼的我居然检查了半天是不是有陷阱最后花了差不多一个小时才做掉我做过的原题...真的傻逼了我:( ...

  5. BZOJ做题记录[0512~?]

    觉得做一道开一篇真不好...好多想找的东西都被刷下去了... 至于?的日期究竟到什么时候...还是看心情...但是估计不会超过七天吧 最后更新时间:05/19 10:42 [05/14 10:56]我 ...

  6. Sam做题记录

    Sam做题记录 Hihocoder 后缀自动机二·重复旋律5 求一个串中本质不同的子串数 显然,答案是 \(\sum len[i]-len[fa[i]]\) Hihocoder 后缀自动机三·重复旋律 ...

  7. l洛谷 P3926 SAC E#1 - 一道不可做题 Jelly

    P3926 SAC E#1 - 一道不可做题 Jelly 题目背景 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢吃蒟蒻果冻.而SOL菌也很喜欢蒟蒻果冻. 有一 ...

  8. 退役III次后做题记录(扯淡)

    退役III次后做题记录(扯淡) CF607E Cross Sum 计算几何屎题 直接二分一下,算出每条线的位置然后算 注意相对位置这个不能先搞出坐标,直接算角度就行了,不然会卡精度/px flag:计 ...

  9. 退役II次后做题记录

    退役II次后做题记录 感觉没啥好更的,咕. atcoder1219 历史研究 回滚莫队. [六省联考2017]组合数问题 我是傻逼 按照组合意义等价于\(nk\)个物品,选的物品\(\mod k\) ...

随机推荐

  1. 前端流程图jsplumb学习笔记

    1.这篇博客很好,另外两个是官网文档 http://www.cnblogs.com/leomYili/p/6346526.html https://jsplumbtoolkit.com/communi ...

  2. Java多线程-----单例模式在多线程中的使用用问题

       1.饿汉模式(立即加载模式)与多线程 不管需不需要用到实例都要去创建实例,即在类产生的时候就创建好实例 package com.thread; /** * 饿汉模式 * * @author yy ...

  3. 【2017-2-21】C#分支语句,分支嵌套,变量的作用域

    分支语句 句式:if else(必须是if开头,可以是else if或者else结束,也可以直接结束) if(bool型比较表达式) { 如果上面的条件成立,则执行这里面的代码 } else if(b ...

  4. qDeleteAll 之后必须清空容器

    [1]qDeleteAll应用示例 qDeleteAll源码如下: template <typename ForwardIterator> Q_OUTOFLINE_TEMPLATE voi ...

  5. mac下编译cpu only caffe并用xCode建caffe工程

    mac编译caffe 好像又变容易了,直接git clone下载blvc源码,make.config里去掉了CPU_ONLY前面的注释,并没有安装任何依赖,也可能是自己mac上本来有, xCode里调 ...

  6. 设计模式之Interpreter(解释器)(转)

    Interpreter定义: 定义语言的文法 ,并且建立一个解释器来解释该语言中的句子. Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造 ...

  7. L1正则和L2正则的比较分析详解

    原文链接:https://blog.csdn.net/w5688414/article/details/78046960 范数(norm) 数学上,范数是一个向量空间或矩阵上所有向量的长度和大小的求和 ...

  8. flask 自定义验证器(行内验证器、全局验证器)

    自定义验证器 在WTForms中,验证器是指在定义字段时传入validators参数列表的可调用对象,下面来看下编写自定义验证器. 行内验证器 除了使用WTForms提供的验证器来验证表单字段,我们还 ...

  9. 委托、匿名函数到lambda表达式

    在C#2.0之前就有委托了,在2.0之后又引入了匿名方法,C#3.0之后,又引入了Lambda表达式,他们三者之间的顺序是:委托->匿名表达式->Lambda表达式,微软的一步步升级,带给 ...

  10. Django框架----模板语法

    Django模板系统 官方文档 一.什么是模板? 只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板. 二.模板语法分类 只需要记两种特殊符号: {{  }}和 {% %} 变量 ...