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

CSP202409B:字符串 K 次替换查询的高效解法

今天我们来看CSP202409B. 字符串变换这道题目:

题意很简单,给定替换函数f,将某些字符替换成其它字符,求执行K次替换后的结果

首先,我们可以想到最暴力的解法:

1.维护一个map<char,char> mp,记录每个映射关系

2.执行k轮变换,每轮变换对每个字符c执行操作:c=mp[c]

这样就得到了如下代码

# include <bits/stdc++.h> using namespace std; #define itn int #define ll long long #define ld long double #define mod 998244353 int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); string s; getline(cin,s); // 有空格,用getline读取 int n; cin>>n; cin.ignore(); map<char,char> mp; for (char c = 'A'; c <= 'Z'; c++) mp[c] = c; for (char c = 'a'; c <= 'z'; c++) mp[c] = c; for (char c = '0'; c <= '9'; c++) mp[c] = c; mp[' '] = ' '; string temp; for(int i=0;i<n;i++) { getline(cin,temp); mp[temp[1]]=temp[2]; } mp['#']='#'; int m; cin>>m; while(m--) { int k; cin>>k; string ss=s; for(int i=0;i<ss.length();i++) { for (int j = 0; j < k; j++) { if (mp[ss[i]]==ss[i]) break; ss[i]=mp[ss[i]]; } } cout<<ss<<endl; } return 0; }

我们发现暴力的解法只能得到80分,考虑对解法优化

对每个字符c,我们记录它不断映射后的结果,无非两种:

1.进入自环:形成一条链,最后一个字符满足 mp[c] = c,可视为一个自环。
2. 进入真循环:存在 mp[a] = b, mp[b] = c, mp[c] = a 的情况,即形成环。

也就是说f最后一定会进入某个循环,那么我们只需要对每个字符进行dfs遍历,找到循环起点和环大小,如果k比循环起点小,那么直接找路径对应位置,否则,说明已经进入循环,对 k 取模后映射到环上的对应字符。

这样,我们就得到了满分代码:

# include <bits/stdc++.h> using namespace std; #define itn int #define ll long long #define ld long double #define mod 998244353 char get(char c,int k,const map<char,char> &mp) { vector<char> path; // 存储从字符c开始的变换路径 set<char> visited; // 记录访问过的字符 char current=c; while (visited.find(current)==visited.end()) { visited.insert(current); path.push_back(current); current=mp.at(current); } int cycle_start=0; // 记录循环起点 while (path[cycle_start]!=current) cycle_start++; if (k<cycle_start) return path[k]; int remaining=k-cycle_start; int cycle_len=path.size()-cycle_start; return path[cycle_start+remaining%cycle_len]; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); string s; getline(cin,s); s=s.substr(1,s.length()-2); int n; cin>>n; cin.ignore(); map<char,char> mp; for (char c = 'A'; c <= 'Z'; c++) mp[c] = c; for (char c = 'a'; c <= 'z'; c++) mp[c] = c; for (char c = '0'; c <= '9'; c++) mp[c] = c; mp[' '] = ' '; string temp; while (n--) { getline(cin,temp); mp[temp[1]]=temp[2]; } int m; cin>>m; while (m--) { int k; cin>>k; string res=s; for (char &c:res) { c=get(c,k,mp); } cout<<"#"<<res<<"#"<<endl; } return 0; }

感谢阅读!

转载标明出处

http://www.jsqmd.com/news/1215552/

相关文章:

  • 江阴全域打井哪家靠谱?瑞溪泉水利工程有限公司浅谈江阴岩石深井、降水井与山区打井实战经验及客户好评 - 瑞溪泉水利
  • Cursor自动化脚本性能压测报告:单脚本吞吐量达2143 ops/sec,比传统Shell快11.8倍(附Benchmark原始数据集)
  • F2800157开发板图形化配置 MCAN 报文收发笔记
  • 帝舵中国官方售后服务中心|服务热线及详细地址权威信息通告(2026年7月更新) - 帝舵中国官方服务中心
  • 公司一堆印章借出去就没人管了?我用飞算 JavaAI 做了个印章管控系统
  • 3步掌握WindowResizer:打造完美桌面布局的终极指南
  • 【2026最新】555电影官网入口,稳定一键直达
  • 【Webhook触发器终极指南】:扣子平台98%开发者忽略的5个致命配置陷阱
  • 改稿速度拉满 2026 最新降AI率工具测评与推荐
  • 2026年蜘蛛池最新规则,新手入门必看
  • 几乎跪着刷完飞书的 Agent!真的太清晰了~
  • 新疆旅游报什么团好?2026本地人实测:4种团型优劣+避坑全攻略 - 旅行分享
  • 嘉兴南湖区老厂房改造想打井,前期需要做什么勘察?旧厂房打井勘察要点 - 瑞溪泉水利
  • 亲身到店探访杭州雷达官方售后服务中心|网点地址及24小时电话(2026年7月最新) - 亨得利钟表维修中心
  • AsrTools语音转文字工具:高效批量处理音频视频文件,智能生成SRT字幕
  • 积家香港官方售后服务网点通告:2026年7月最新地址+热线 - 积家官方售后服务中心
  • 安装读卡器驱动WIN10禁用数字签名
  • 1行命令唤醒沉睡的替换能力:Cursor 0.42+ 版本新增`@workspace:replace`语法全解
  • 上海静安黄金回收哪家靠谱?全域103实体门店,双资质检测绝不压低回收价 - 一日一测评
  • 9款AI写论文工具:一键生成开题报告、论文大纲、毕业论文与期刊论文
  • 完整指南:如何在3分钟内安装使用开源视频下载插件
  • LAMP 部署 Discuz 论坛
  • 当手工报表消失:企业报表自动化正在重构团队的数据能力
  • 从页面到智能体:前端转型AI应用,我先把后端这堵墙撞碎了
  • vue3 语法糖中withDefaults的用法
  • 从TypeError到TypeScript精准推导:Claude类型感知调试术,附12个可复用诊断Prompt
  • 2026 程序员AI提效:用AI把100页PDF浓缩成3分钟摘要(附3套提示词,建议收藏)
  • 电商、零售、餐饮业的报表自动化:三个行业,三种升级路径
  • 萧邦官方服务项目及价格查询|全新热线和维修门店地址权威信息声明(2026年7月最新) - 萧邦中国官方服务中心
  • w64devkit:Windows C/C++开发者的便携式瑞士军刀