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

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

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

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

时间复杂度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. awk命令学习(1)

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...

  2. ASP.NET JSON(转http://www.360doc.com/content/14/0615/21/18155648_386887590.shtml)

    概念介绍还是先简单说说Json的一些例子吧.注意,以下概念是我自己定义的,可以参考.net里面的TYPE的模型设计如果有争议,欢迎提出来探讨!1.最简单:{"total":0} t ...

  3. UIView常见方法

    - (void)addSubview:(UIView *)view; 添加一个子控件view   - (void)removeFromSuperview; 从父控件中移除 - (UIView *)vi ...

  4. C# 队列(Queue)和 堆栈(Stack)

    C# 队列(Queue)和 堆栈(Stack) C# 队列(Queue) 队列(Queue)代表了一个先进先出的对象集合.当您需要对各项进行先进先出的访问时,则使用队列.当您在列表中添加一项,称为入队 ...

  5. EasyUI表格DataGrid获取数据的方式

       第一种方式:直接返回JSON数据 package com.easyuijson.util; import java.text.SimpleDateFormat; import net.sf.js ...

  6. 为什么C++函数形参默认值从最末一个赋值?

    [1]函数调用时形参的压栈顺序 1.示例代码如下(VS2010): #include <iostream> using namespace std; ); void fun(int a, ...

  7. python isinstance()方法的使用

    1. 描述Python中的 isinstance() 函数,是Python中的一个内置函数,用来判断一个函数是否是一个已知的类型,类似 type(). 2. 语法isinstance(object,c ...

  8. 【函数封装】javascript判断是否是微信浏览器

    //判断是否是微信浏览器的函数 function isWeiXin(){ //window.navigator.userAgent属性包含了浏览器类型.版本.操作系统类型.浏览器引擎类型等信息,这个属 ...

  9. Java基础整理

    一.Java中的遍历 1.在java开发中会碰到遍历List删除其中多个元素的情况,如果使用一般的for循环以及增强的for循环,代码会抛出异常ConcurrentModificationExcept ...

  10. 转:【专题四】自定义Web浏览器

    前言: 前一个专题介绍了自定义的Web服务器,然而向Web服务器发出请求的正是本专题要介绍的Web浏览器,本专题通过简单自定义一个Web浏览器来简单介绍浏览器的工作原理,以及帮助一些初学者揭开浏览器这 ...