当前位置: 首页 > 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.xdnf.cn/news/791587.html

相关文章:

  • 【AI学习从零至壹】基于深度学习的⽂本分类任务
  • C++算法训练营 Day6 哈希表(1)
  • 《仿盒马》app开发技术分享-- 个人中心关于逻辑完善(端云一体)
  • Java 文件操作 和 IO(5)-- 综合案例练习 -- 示例三
  • 移动端测试岗位高频面试题及解析
  • 左值引用和右值引用
  • 【C++篇】STL适配器(下篇):优先级队列与反向迭代器的底层奥秘
  • Splitting Items
  • torch.nn中的各种组件
  • element级联地址选择器
  • java类的生命周期
  • Make All Equal
  • 2.2.2 06年T3
  • LeetCode 152. 乘积最大子数组 - 动态规划解法详解
  • 集成学习三种框架
  • C++中的指针参数传递与引用参数传递详解
  • 5985/wsman 是什么?
  • 一、基础环境配置
  • Linux中实现用户态DMA直通访问的零拷贝机制
  • 《Spring Bean 是怎么被创建出来的?容器启动流程全景分析》
  • 小体积涵盖日常办公等多功能的软件
  • MyBatis实战项目测试
  • 2025.6.3学习日记 Nginx 基本概念 配置 指令 文件
  • React-native之Flexbox
  • nginx 如何禁用tls1.0
  • CSS radial-gradient函数详解
  • JVM-内存结构
  • MAU算法流程理解
  • VueUse:组合式API实用函数全集
  • ADI硬件笔试面试题型解析上