洛谷 P9680 string[_view] 题解
1.CSP-S 2023 T1 题解
2.洛谷 P9680 string[_view] 题解
3.洛谷 U388010 题解4.洛谷 P1044 [NOIP2003 普及组] 栈 题解5.P9713 「QFOI R1」抱抱 题解洛谷 P9680 string[_view] 题解
Sol
模拟题。
我们先定义一个结构体,来存储定义的字符串的名字,内容和长度。每一次输入分两个字符串,一个是类型,一个是名字和赋值内容。当遇到 string
时,如果是用字面量赋值,那么就计算引号里字符串的长度 。然后把答案加上 ,并把名字,内容,长度存储起来。如果是出现过的变量名赋值,那么在已经存储的字符串里查找,如果查找到了,那么把查找到的字符串的内容和长度赋值给新字符串并存储名字。再把答案加上长度。遇到 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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】