当前位置: 首页 > news >正文

CCF CSP 第37次(2025.03)(3_模板展开_C++)(哈希表+stringstream)

CCF CSP 第37次(2025.03)(3_模板展开_C++)

      • 解题思路:
        • 思路一(哈希表+stringstream):
      • 代码实现
        • 代码实现(思路一(哈希表+stringstream)):
        • 部分代码解读

时间限制: 1.0 秒
空间限制: 512 MiB
原题链接
在这里插入图片描述

解题思路:

思路一(哈希表+stringstream):

1、解题步骤拆分:
① 数据输入:

  • 第一行输入一个整数n(模板语言的语句数量)。
  • 接下来 n 行,每行一个语句。

② 数据处理:

  • 表达式中 $ a 代表 a 为字符串变量 ,表达式无 $ 则代表普通字符串 如 “a”
  • 存在三种类型:
          类型1:第一个元素为1,此时第二个元素为变量,后边元素为表达式(表达式中的变量 无需 转换成对应的值)
          类型2:第一个元素为2,此时第二个元素为变量,后边元素为表达式(表达式中的变量 需要 转换成对应的值)
          类型3:第一个元素为3,此时第二个元素为变量,后边表达式中存在变量需转换($)后输出,且输出的是字符串的长度。

在这里存储变量的一一对应关系可以想到哈希表

③ 数据输出:即 数据处理中的类型 3 。

代码实现

代码实现(思路一(哈希表+stringstream)):
#include<iostream>
#include<vector>
#include<sstream>
#include<unordered_map>
using namespace std;// 这个函数用来根据给定的表达式计算结果,表达式可以包含变量。
// `expr` 是表达式,`variables` 是存储所有变量及其值的映射。
string evaluate_expression(const string &expr, unordered_map<string, string> &variables){stringstream ss(expr);  // 用 stringstream 逐步处理表达式string part, result;// 将表达式按空格分割并逐个处理while (ss >> part) {// 如果部分是变量(以 '$' 开头),从 variables 中获取对应的值if (part[0] == '$') {string var_name = part.substr(1);  // 去掉 '$',提取变量名result += variables[var_name];  // 拼接变量的值到结果字符串} else {result += part;  // 如果不是变量,直接拼接字符串}}return result;  // 返回最终的拼接结果
}int main(int argc, char const *argv[]) {int n;  // 模板语言的语句数量cin >> n;cin.ignore();  // 忽略输入中的换行符unordered_map<string, string> variables;  // 存储已定义的变量及其值unordered_map<string, string> delayed;  // 存储待延迟求值的表达式// 处理接下来的 n 行,每行为一个语句for (int i = 0; i < n; i++) {string line;getline(cin, line);  // 读取每一行输入stringstream ss(line);string type;ss >> type;  // 读取语句的类型(1、2 或 3)if (type == "1") {  // 类型 1: 定义变量string var, expr;ss >> var;  // 读取变量名getline(ss, expr);  // 读取变量表达式// 计算表达式的值并将结果存入变量中string value = evaluate_expression(expr, variables);variables[var] = value;  // 存储变量及其计算后的值} else if (type == "2") {  // 类型 2: 延迟定义变量string var, expr;ss >> var;  // 读取变量名getline(ss, expr);  // 读取变量表达式// 将变量和对应的表达式存入 delayed 中delayed[var] = expr;} else if (type == "3") {  // 类型 3: 输出变量的长度string var;ss >> var;  // 读取变量名// 如果变量不存在于 delayed 和 variables 中,输出 0if (!delayed.count(var) && !variables.count(var)) {cout << 0 << endl;continue;}// 如果变量在 delayed 中,先计算其值并存入 variablesif (delayed.count(var)) {string expr = delayed[var];string value = evaluate_expression(expr, variables);variables[var] = value;}// 输出变量的值的长度,取模 1000000007string value = variables[var];cout << value.length() % 1000000007 << endl;}}return 0;  // 程序结束
}
部分代码解读
//stringstream的用法
void function_stringstream (){//1、将字符串转换为整数stringstream ss1("123");int num1;ss1>>num1;cout<<num1<<endl;//2、将整数转换为字符串stringstream ss2;int num2=123;ss2<<num2;string str=ss2.str();cout<<str<<endl;//3、逐步解析字符串stringstream ss3("10 20 30");int a,b,c;ss3>>a>>b>>c;cout<<a<<b<<c<<endl;//4、字符串拼接stringstream ss4;int num4=10;string str4= "The number is ";ss4<<str4<<num4;string result = ss4.str();cout<<result<<endl;}

欢迎大家和我沟通交流(✿◠‿◠)

http://www.lqws.cn/news/110557.html

相关文章:

  • 相机--相机成像原理和基础概念
  • 使用大模型预测亚急性脊髓联合变性的技术方案大纲
  • 【Android】双指旋转手势
  • OCC笔记:TopoDS_Edge上是否一定存在Geom_Curve
  • Nginx配置Ollama 访问api服务
  • 深拷贝与浅拷贝的区别?如何手写实现一个深拷贝?
  • ​​Agentic Voice Stack 热门项目
  • 【SAP FICO】在建工程及固定资产
  • 2023年12月四级真题Reading Comprehension的分析总结
  • LeetCode第245题_最短单词距离III
  • RTC实时时钟DS1338Z-33/PT7C433833WEX国产替代FRTC1338S
  • 自动化采集脚本与隧道IP防封设计
  • EscapeX:去中心化游戏,开启极限娱乐新体验
  • HarmonyOS运动开发:精准估算室内运动的距离、速度与步幅
  • 【QT】自定义QWidget标题栏,可拖拽(拖拽时窗体变为normal大小),可最小/大化、关闭(图文详情)
  • 笔记:算法题目中需要处理 int 某个位的三种方法:for、while、to_string
  • [Java 基础]变量,装东西的盒子
  • 功能管理:基于 ABP 的 Feature Management 实现动态开关
  • 《前端面试题:CSS预处理器(Sass、Less等)》
  • Go语言学习-->第一个go程序--hello world!
  • SQLite详细解读
  • 飞牛fnNAS使用群辉DSM系统
  • 黑马Java面试笔记之 消息中间件篇(RabbitMQ)
  • WPF技术体系与现代化样式
  • 数学复习笔记 24
  • MATLAB实战:视觉伺服控制实现方案
  • 无人机自主降落论文解析
  • 无人机甲烷检测技术革新:开启环境与能源安全监测新时代
  • 无人机智能识别交通目标,AI视觉赋能城市交通治理新高度
  • GPIO的内部结构与功能解析