【题目链接】

ybt 1848:【07NOIP提高组】字符串的展开
OpenJudge NOI 1.7 35:字符串的展开
洛谷 P1098 [NOIP2007 提高组] 字符串的展开

【题目考点】

1. 模拟

2. 字符串

【解题思路】

解法1:使用string类

复杂的模拟题建议使用string类来做。
设结果字符串s_ans
遍历字符串,遇到减号就做展开。

  • 确定减号左右两侧的字符
  • 设展开所产生的字符串s_ins,根据左右两侧的字符得知要添加的各个字符。
  • 根据p1对要添加的字符做处理,将该字符添加p2个。
  • 如果p3为2,那么再将s_ins反序。
  • 最后将s_ins接在s_ans后面
    如果没有遇到减号,那么直接将当前遍历到的字符接在s_ans后面
    最后输出s_ans

解法2:使用字符数组

整体思路与解法1相同。

  • 数组长度:考虑极端情况,长为100的字符串中有50个减号,都能展开每个展开都是a~z,每个字母最多8个(已知p2<=8)粗略估算结果最多有24∗8∗50+50=965024*8*50+50=965024∗8∗50+50=9650,数组长度取10000即可。
  • 字符数组末尾添加字符:使用数组填充写法。设字符数组s当前长度为len,要添加字符c:s[len++] = c;

【题解代码】

解法1:使用string类, <cctype>函数

#include<bits/stdc++.h>
using namespace std;
int main()
{int p1, p2, p3;string s, s_ans;//s_ans:结果字符串   char lc, rc;cin >> p1 >> p2 >> p3;cin >> s;s_ans.push_back(s[0]);for(int i = 1; i < s.length(); ++i)//第0位置不看了,有减号也无法展开 {if(s[i] == '-'){string s_ins;//要插入的字符串 lc = s[i-1];rc = s[i+1];if((islower(lc) && islower(rc) || isdigit(lc) && isdigit(rc)) && lc < rc){ for(char c = lc + 1; c <= rc - 1; ++c)//每次填充的字符c for(int j = 1; j <= p2; ++j)//每个字符填充p2个 {if(p1 == 3)s_ins.push_back('*');else if(isdigit(lc) || p1 == 1 && islower(lc))s_ins.push_back(c);else if(p1 == 2)s_ins.push_back(toupper(c));}if(p3 == 2)reverse(s_ins.begin(), s_ins.end());}elses_ins.push_back('-');s_ans += s_ins;//连接要插入的字符串 }elses_ans.push_back(s[i]);}cout << s_ans;return 0;
}

解法2:使用字符数组,自己写函数做判断

#include<bits/stdc++.h>
using namespace std;
#define N 10000
int p1, p2, p3, l_a, l_i;//l_a:s_ans的长度 l_i:ins字符串的长度
char s[N], s_ans[N], s_ins[N];//ans:结果字符串 ins:要插入的字符串
bool isLower(char c)
{return c >= 'a' && c <= 'z';
}
bool isDigit(char c)
{return c >= '0' && c <= '9';
}
int main()
{char lc, rc;cin >> p1 >> p2 >> p3;cin >> s;s_ans[l_a++] = s[0];int len = strlen(s);for(int i = 1; i < len; ++i)//第0位置不看了,有减号也无法展开 {if(s[i] == '-'){l_i = 0;//s_ins字符串的长度 lc = s[i-1];rc = s[i+1];if((isLower(lc) && isLower(rc) || isDigit(lc) && isDigit(rc)) && lc < rc){ for(char c = lc + 1; c <= rc - 1; ++c)//每次填充的字符c for(int j = 1; j <= p2; ++j)//每个字符填充p2个 {if(p1 == 3)s_ins[l_i++] = '*';else if(isDigit(lc) || p1 == 1 && isLower(lc))s_ins[l_i++] = c;else if(p1 == 2)s_ins[l_i++] = c - 32;}if(p3 == 2)//倒序填充 {for(int j = l_i - 1; j >= 0; --j)s_ans[l_a++] = s_ins[j];}else//正序填充 {for(int j = 0; j < l_i; ++j)s_ans[l_a++] = s_ins[j];}}elses_ans[l_a++] = '-'; }elses_ans[l_a++] = s[i];}s_ans[l_a] = '\0';cout << s_ans;return 0;
}

信息学奥赛一本通 1848:【07NOIP提高组】字符串的展开 | OpenJudge NOI 1.7 35:字符串的展开 | 洛谷 P1098 [NOIP2007 提高组] 字符串的展开相关推荐

  1. 信息学奥赛一本通 1092:求出e的值 | OpenJudge NOI 1.5 35

    [题目链接] ybt 1092:求出e的值 OpenJudge NOI 1.5 35:求出e的值 [题目考点] 1. 求一个数的阶乘 假设求n的阶乘,设结果变量为r,其初值为1. i从1循环到n,每次 ...

  2. 信息学奥赛一本通 1925:【03NOIP普及组】麦森数 | OpenJudge NOI 4.4 1708:麦森数 | 洛谷 P1045 [NOIP2003 普及组] 麦森数

    [题目链接] ybt 1925:[03NOIP普及组]麦森数 OpenJudge NOI 4.4 1708:麦森数 洛谷 P1045 [NOIP2003 普及组] 麦森数 [题目考点] 1. 高精度 ...

  3. 信息学奥赛一本通 1031:反向输出一个三位数 | OpenJudge NOI 1.3 13

    [题目链接] ybt 1031:反向输出一个三位数 OpenJudge NOI 1.3 13:反向输出一个三位数 [题目考点] 1. 分离固定数位数字的各位上的数字 先举例说明: 对于三位数123,其 ...

  4. 信息学奥赛一本通 1245:不重复地输出数 | OpenJudge NOI 1.11 08:不重复地输出数

    [题目链接] ybt 1245:不重复地输出数 OpenJudge NOI 1.11 08:不重复地输出数 [题目考点] 1. 二分查找 2. 复杂度为O(nlogn)的排序 快速排序:时间复杂度O( ...

  5. 信息学奥赛一本通 1170:计算2的N次方 | OpenJudge NOI 1.6 12:计算2的N次方

    [题目链接] ybt 1170:计算2的N次方 OpenJudge NOI 1.6 12:计算2的N次方 [题目考点] 1. 高精度 考察:高精乘低精 高精度计算讲解 2. 快速幂 [解题思路] 先估 ...

  6. 信息学奥赛一本通 1411:区间内的真素数 | OpenJudge NOI 1.13 23:区间内的真素数

    [题目链接] ybt 1411:区间内的真素数 OpenJudge NOI 1.13 23:区间内的真素数 [题目考点] 1. 质数 2. 数字拆分 [解题思路] 设函数判断一个数是否是质数 设函数求 ...

  7. 信息学奥赛一本通 1405:质数的和与积 | OpenJudge NOI 2.1 7827:质数的和与积 | 小学奥数 7827

    [题目链接] ybt 1405:质数的和与积 OpenJudge NOI 2.1 7827:质数的和与积 OpenJudge NOI 小学奥数 7827:质数的和与积 [题目考点] 1. 枚举 [解题 ...

  8. 信息学奥赛一本通 1397:简单算术表达式求值 | OpenJudge NOI 1.12 01:简单算术表达式求值

    [题目链接] ybt 1397:简单算术表达式求值 OpenJudge NOI 1.12 01:简单算术表达式求值 [题目考点] 1. 函数 2. 选择结构 [解题思路] 这一章节都是练习函数,那么这 ...

  9. 信息学奥赛一本通 1147:最高分数的学生姓名 | OpenJudge NOI 1.9 02:输出最高分数的学生姓名

    [题目链接] ybt 1147:最高分数的学生姓名 OpenJudge NOI 1.9 02:输出最高分数的学生姓名 [题目考点] 1. 结构体 2. 求最大值下标 [题解代码] 解法1:用结构体 设 ...

最新文章

  1. Hadoop:The Definitive Guid 总结 Chapter 1~2 初识Hadoop、MapReduce
  2. 常识之外的规范——阿里java开发手册笔记(全章节)
  3. JVM实战与原理--前言及索引
  4. jquey(判断文本框输入的网址链接是否符合规则)
  5. c++ 输出控制iomanip
  6. CV和NLP中的无监督预训练(生成式BERT/iGPT和判别式SimCLR/SimCSE)
  7. 轻松搞定RabbitMQ(二)——工作队列之消息分发机制
  8. 苹果cms安装 php映射,苹果cmsV10安装过程中的常见问题处理办法
  9. C 语言怎么可能被淘汰呢?
  10. 基于SSM的猫头鹰在线视频网站
  11. 桥梁防撞主动预警系统解决方案-广州泛尔维
  12. miui系统精简工具(免root删除内置软件)
  13. OkHttp Events事件
  14. Fiddler抓包基础使用
  15. 第六章——图(1)——图的基本概念
  16. VS2017解决方案整理解决(一)
  17. Mendix基于腾讯云部署最佳实践
  18. 森林防火监控系统解决方案及标准权威解读
  19. 利用图像内插法放大缩小图像 Matlab
  20. 印度区块链项目Matic Network的应用场景分析

热门文章

  1. ASP.NET数据绑定的记忆碎片
  2. VMWare的The network bridge on device VMnet0 is not running故障解决
  3. hadoop示例源码位置
  4. 推给我的广告都跟我最近看的内容有关系,怎么做到的?
  5. 升值加薪Excel神助攻,数据透视表堪称神器!
  6. r语言折线图_R语言做多变量可视化分析?
  7. python importlib_学习python importlib的导入机制
  8. 面试时说Redis是单线程的,被喷惨了!
  9. ant-design-vue 快速入手及常用标签
  10. 【消息队列MQ】各类MQ比较