洛谷 P9680 string[_view] 题解

link

Sol

模拟题。

我们先定义一个结构体,来存储定义的字符串的名字,内容和长度。每一次输入分两个字符串,一个是类型,一个是名字和赋值内容。当遇到 string 时,如果是用字面量赋值,那么就计算引号里字符串的长度 \(l\)。然后把答案加上 \(l\),并把名字,内容,长度存储起来。如果是出现过的变量名赋值,那么在已经存储的字符串里查找,如果查找到了,那么把查找到的字符串的内容和长度赋值给新字符串并存储名字。再把答案加上长度。遇到 string_view 类型时只需去掉"把答案加上长度"这一步即可。

code

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring> using namespace std; using ll = long long; const int kMaxN = 1e4 + 10, kInf = (((1 << 30) - 1) << 1) + 1; int l, ans = 0;
string a, b, tmp; struct node { // 结构体
string name, t; // 名字和内容
int len; // 长度
} s[kMaxN]; int main() {
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
cin >> l; // 输入 l
for (int i = 1; i <= l; ++ i) {
cin >> a >> b; // a 时类型,b 是名字和赋值内容
if (a == "string") { // 如果是 string 类型
if (b.find("\"") != b.npos) { // 如果是字面量
int fst = b.find("\""); // 查找第一个 "
char tmp = b[fst];
b[fst] = '!';
int scd = b.find("\""); // 查找第二个 "
b[fst] = tmp;
s[i].name = b.substr(0, fst - 1);
// 存储名字(第一个 " 之前的字符串)
s[i].t = b.substr(fst + 1, scd - fst - 1);
// 存储内容(第一个 " 和第二个 " 之间的字符串)
s[i].len = s[i].t.size();
// 存储长度
ans += s[i].len;
// 答案加上长度
} else {
int fst = b.find("("); // 查找 (
char tmp1 = b[fst];
b[fst] = '!';
int scd = b.find(")"); // 查找 )
b[fst] = tmp1;
tmp = b.substr(fst + 1, scd - fst - 1); // 已经存储的字符串的名字
for (int j = 1; j < i; ++ j) { // 查找
if (s[j].name == tmp) { // 如果是配对的
s[i].name = b.substr(0, fst); // 存储名字("(" 之前的字符串)
s[i].t = s[j].t;
// 把内容赋给新字符串
s[i].len = s[j].len;
// 把长度赋给新字符串
break;
}
}
ans += s[i].len;
}
} else {
/*只少了"把答案加上长度"这一步,不做注释*/
if (b.find("\"") != b.npos) {
int fst = b.find("\"");
char tmp = b[fst];
b[fst] = '!';
int scd = b.find("\"");
b[fst] = tmp;
s[i].name = b.substr(0, fst - 1);
s[i].t = b.substr(fst + 1, scd - fst - 1);
s[i].len = s[i].t.size();
} else {
int fst = b.find("(");
char tmp1 = b[fst];
b[fst] = '!';
int scd = b.find(")");
b[fst] = tmp1;
tmp = b.substr(fst + 1, scd - fst - 1);
for (int j = 1; j < i; ++ j) {
if (s[j].name == tmp) {
s[i].name = b.substr(0, fst);
s[i].t = s[j].t;
s[i].len = s[j].len;
break;
}
}
}
}
}
cout << ans << '\n';
return 0;
}

洛谷 P9680 string[_view] 题解的更多相关文章

  1. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

  2. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  3. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

  4. 洛谷P1577 切绳子题解

    洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...

  5. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  6. 洛谷 P1220 关路灯 题解

    Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...

  7. 洛谷 P3695 CYaRon!语 题解 【模拟】【字符串】

    大模拟好啊! 万一远古计算机让我写个解释器还真是得爆零了呢. 题目背景 「千歌です」(我是千歌).「曜です」(我是曜).「ルビィです」(我是露比).「3人合わせて.We are CYaRon! よろし ...

  8. 洛谷 P1219 八皇后题解

    题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...

  9. 洛谷 P1020导弹拦截题解

    洛谷链接:https://www.luogu.org/problem/P1020 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到 ...

  10. 【洛谷P3410】拍照题解(最大权闭合子图总结)

    题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一定钱让n个人中的一些人进行合影.如果这一些人没带齐那么就不能拍照,小B也不会得到钱. 注意:带下属不是白带的 ...

随机推荐

  1. JVM 的内存区域是如何划分的?

    JVM 的内存区域划分 JVM 在运行时会将内存划分为多个区域,用于管理程序运行时的不同类型数据.以下是 JVM 内存的主要划分: 1. 方法区(Method Area) 定义: 方法区是运行时数据区 ...

  2. Quill自定义插入视频video实例

    import Quill from 'quill' const BlockEmbed = Quill.import('blots/block/embed') class VideoBlot exten ...

  3. 在Podman中配置Dify Sandbox服务与外部PostgreSQL服务的网络连接

    在Podman中配置Dify Sandbox服务与外部PostgreSQL服务的网络连接 引言 在容器化环境中,确保不同服务之间的可靠通信是至关重要的.本文将指导你如何使用Podman来配置Dify ...

  4. 【经验】Word 2021|如何在Word里做出和Markdown中一样漂亮的引用样式(结尾附成品)

    文章目录 写在最前 方法以及参数 1 打开样式窗口 2 设置一些基本操作 3 打开格式窗口 4 修改样式 最后一步!保持间隔 成品的介绍(一些自卖自夸)+获取链接(不想看做法的话直接下载) 写在最前 ...

  5. Swiper.js滑动插件使用教程

    几乎每个前端开发都应该用过这个滑动组件库吧?这就是大名鼎鼎的swiper.js 一.Swiper及其功能 Swiper.js 是一个流行的开源的移动端触摸滑动库,用于创建响应式.可触摸滑动的轮播图.滑 ...

  6. AD 侦查-LLMNR 毒化

    本文通过 Google 翻译 AD Recon – LLMNR Poisoning with Responder 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充. 导航 ...

  7. 深入浅出:AST 技术的应用与实践

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  8. Python标准库之Collections---Container datatype

    Deques Deques,即 Double-ended-queues,是支持线程安全,内存高效的列表类对象.Deques是可改变的,支持索引等类似于list的操作,然而,我们不能直接对Deques进 ...

  9. 为何PostgreSQL没有聚集索引?解读两大数据库的设计差异

    为何PostgreSQL没有聚集索引?解读两大数据库的设计差异 前言 高效的数据检索是数据库管理的基石, PostgreSQL和SQL Server都能提供强大的数据访问方法以支持各种工作负载方面表现 ...

  10. Win32汇编学习笔记07.筛选器异常

    Win32汇编学习笔记07.筛选器异常-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net 钢琴 od调试老师给的多媒体钢琴 运行找到Piano的过程函数里去 找到处理 ...