信息学奥赛一本通 1848:【07NOIP提高组】字符串的展开 | OpenJudge NOI 1.7 35:字符串的展开 | 洛谷 P1098 [NOIP2007 提高组] 字符串的展开
【题目链接】
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 提高组] 字符串的展开相关推荐
- 信息学奥赛一本通 1092:求出e的值 | OpenJudge NOI 1.5 35
[题目链接] ybt 1092:求出e的值 OpenJudge NOI 1.5 35:求出e的值 [题目考点] 1. 求一个数的阶乘 假设求n的阶乘,设结果变量为r,其初值为1. i从1循环到n,每次 ...
- 信息学奥赛一本通 1925:【03NOIP普及组】麦森数 | OpenJudge NOI 4.4 1708:麦森数 | 洛谷 P1045 [NOIP2003 普及组] 麦森数
[题目链接] ybt 1925:[03NOIP普及组]麦森数 OpenJudge NOI 4.4 1708:麦森数 洛谷 P1045 [NOIP2003 普及组] 麦森数 [题目考点] 1. 高精度 ...
- 信息学奥赛一本通 1031:反向输出一个三位数 | OpenJudge NOI 1.3 13
[题目链接] ybt 1031:反向输出一个三位数 OpenJudge NOI 1.3 13:反向输出一个三位数 [题目考点] 1. 分离固定数位数字的各位上的数字 先举例说明: 对于三位数123,其 ...
- 信息学奥赛一本通 1245:不重复地输出数 | OpenJudge NOI 1.11 08:不重复地输出数
[题目链接] ybt 1245:不重复地输出数 OpenJudge NOI 1.11 08:不重复地输出数 [题目考点] 1. 二分查找 2. 复杂度为O(nlogn)的排序 快速排序:时间复杂度O( ...
- 信息学奥赛一本通 1170:计算2的N次方 | OpenJudge NOI 1.6 12:计算2的N次方
[题目链接] ybt 1170:计算2的N次方 OpenJudge NOI 1.6 12:计算2的N次方 [题目考点] 1. 高精度 考察:高精乘低精 高精度计算讲解 2. 快速幂 [解题思路] 先估 ...
- 信息学奥赛一本通 1411:区间内的真素数 | OpenJudge NOI 1.13 23:区间内的真素数
[题目链接] ybt 1411:区间内的真素数 OpenJudge NOI 1.13 23:区间内的真素数 [题目考点] 1. 质数 2. 数字拆分 [解题思路] 设函数判断一个数是否是质数 设函数求 ...
- 信息学奥赛一本通 1405:质数的和与积 | OpenJudge NOI 2.1 7827:质数的和与积 | 小学奥数 7827
[题目链接] ybt 1405:质数的和与积 OpenJudge NOI 2.1 7827:质数的和与积 OpenJudge NOI 小学奥数 7827:质数的和与积 [题目考点] 1. 枚举 [解题 ...
- 信息学奥赛一本通 1397:简单算术表达式求值 | OpenJudge NOI 1.12 01:简单算术表达式求值
[题目链接] ybt 1397:简单算术表达式求值 OpenJudge NOI 1.12 01:简单算术表达式求值 [题目考点] 1. 函数 2. 选择结构 [解题思路] 这一章节都是练习函数,那么这 ...
- 信息学奥赛一本通 1147:最高分数的学生姓名 | OpenJudge NOI 1.9 02:输出最高分数的学生姓名
[题目链接] ybt 1147:最高分数的学生姓名 OpenJudge NOI 1.9 02:输出最高分数的学生姓名 [题目考点] 1. 结构体 2. 求最大值下标 [题解代码] 解法1:用结构体 设 ...
最新文章
- Hadoop:The Definitive Guid 总结 Chapter 1~2 初识Hadoop、MapReduce
- 常识之外的规范——阿里java开发手册笔记(全章节)
- JVM实战与原理--前言及索引
- jquey(判断文本框输入的网址链接是否符合规则)
- c++ 输出控制iomanip
- CV和NLP中的无监督预训练(生成式BERT/iGPT和判别式SimCLR/SimCSE)
- 轻松搞定RabbitMQ(二)——工作队列之消息分发机制
- 苹果cms安装 php映射,苹果cmsV10安装过程中的常见问题处理办法
- C 语言怎么可能被淘汰呢?
- 基于SSM的猫头鹰在线视频网站
- 桥梁防撞主动预警系统解决方案-广州泛尔维
- miui系统精简工具(免root删除内置软件)
- OkHttp Events事件
- Fiddler抓包基础使用
- 第六章——图(1)——图的基本概念
- VS2017解决方案整理解决(一)
- Mendix基于腾讯云部署最佳实践
- 森林防火监控系统解决方案及标准权威解读
- 利用图像内插法放大缩小图像 Matlab
- 印度区块链项目Matic Network的应用场景分析