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

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

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

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

时间复杂度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. callback源码分析——callbacks

    uvm的callback必须是提供者有预见性的留一些方法在function前后,这样在使用的时候,进行遍历调度即可 设计者,需要从uvm_callback定义一个基类,只定义function原型,定义 ...

  2. Python全栈-day4-语法基础2

    一.字符串 1.字符串基础 1)作用:用于描述姓名.性别.地址等信息 2)定义方式:单引号或者双引号以及三引号内添加字符 注:day3中介绍 name = 'zhang' user_name = &q ...

  3. python-demo实例

    1.turtle库与蟒蛇案例 import turtle def drawSnake(rad,angle,len,neckrad): for i in range(len): turtle.circl ...

  4. python -- 判断给定的参数是否是地理位置的经度和纬度

    例子: coordinates = "2.3,-8ui" 无效地理位置 coordinates = "2.3,-8i" 有效地理位置 方法一:使用try...e ...

  5. sitecore系列教程之营销人员和技术人员如何策划与消费者的对话以提升体验?

    “每次良好的交谈都要从良好的倾听开始.” - 未知 你是如何听取网站访问者的?你是在倾听还是只是回复? 拥有内容管理系统只是良好网站战略的一个要素.毕竟,内容必须是动态的,及时的和相关的. 当网站访问 ...

  6. Necklace (全排列 + 匈牙利)

    #include<bits/stdc++.h> using namespace std; ][], Gra[][]; ]; ]; ]; bool dfs(int u, int vN) { ...

  7. Spark学习之路 (二十八)分布式图计算系统

    一.引言 在了解GraphX之前,需要先了解关于通用的分布式图计算框架的两个常见问题:图存储模式和图计算模式. 二.图存储模式 巨型图的存储总体上有边分割和点分割两种存储方式.2013年,GraphL ...

  8. python 将字节写入文本文件

    想在文本模式打开的文件中写入原始的字节数据 将字节数据直接写入文件的缓冲区即可 >>> import sys >>> sys.stdout.write(b'Hell ...

  9. android使用ARouter跳转activity(阿里巴巴开源的)

    android使用ARouter跳转activity(阿里巴巴开源的) 使用ARouter方式,点击按钮跳转到其他activitypublic void buyOrSell(String str){ ...

  10. window下nodejs用nodemon启动koa2项目(用cmd启动不了,要用Git Bash Here 启动才可以)

    window下nodejs用nodemon启动koa2项目(用cmd启动不了,要用Git Bash Here 启动才可以)nodemon --watch 'app/**/*' -e ts --exec ...