【做题】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\) ...
随机推荐
- java outterLoop跳出多重循环用法以及详解
List<CommResultMsg> listresult=new ArrayList<CommResultMsg>(); outterLoop :for (int i = ...
- 向量体系结构(2)----SIMD指令集扩展和GPU
进行SIMD多媒体扩展的设计,源于一个很容易观察到的事实: 许多多媒体应用程序操作的数据类型比对32位处理器进行针对性优化的数据类型更窄一些. 图像三基色,都是8位.音频采样也都是8位和16位来表示. ...
- django 网站的搭建(1)
使用 python django 模块来搭建自己的博客网站. 本人环境:阿里云centos7+django1.10+python3.5 使用工具:putty + winscp 1.首先安装python ...
- 2.匿名类,匿名类对象,private/protected/public关键字、abstract抽象类,抽象方法、final关键字的使用,多线程Thread类start方法原理
package com.bawei.multithread; //注意:模板方法我们通常使用抽象类或者抽象方法!这里我们为了方便在本类中使用就没有使用抽象类/抽象方法 public class Tem ...
- hdu5422 最大表示法+KMP
#include <iostream> #include <algorithm> #include <string.h> #include <cstdio&g ...
- Echo团队团队展示
班级:软件工程1916|W 作业:团队作业第一次-团队展示 团队名称:Echo 课程目标:展示团队 成员信息 队员学号 队员姓名 个人博客地址 备注 221600418 黄少勇 http://www. ...
- STL容器之map
[1]map容器 map 是关联容器.容器中的每一个元素都是由一个键值和一个数据值组成的. set 是一个集合它以其元素作为键值(同一个键值只能出现一次),且默认以升序排列. list 是一个顺序容器 ...
- python 内置函数format
Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能. 基本语法是通过 {} 和 : 来代替以前的 % . format 函数可以接受不限个参数 ...
- 【转】Tomcat 快速入门
本文转载自:https://www.cnblogs.com/jingmoxukong/p/8258837.html?utm_source=gold_browser_extension 目录 Tomca ...
- byte以及UTF-8的转码规则
https://www.cnblogs.com/hell8088/p/9184336.html 多年来闲麻烦,只记录笔记,不曾编写BLOG,本文为原创,如需转载请标明出处 废话不说,直奔主题 asci ...