题目链接:https://www.luogu.com.cn/problem/P1098

这个题出的真的很有质量,这个是我见过算是复杂的模拟题了,对付这种题,一丝都不能马虎,要想实现快捷而又简便的代码设计,并且针对于这个题繁琐的各种变量,我们采取STL大法,全局都采取STL大法的题目真的是不多,但这个题真的很值得。

我们必须要熟悉STL库的顺序式容器和关联式容器的STL表述方法,并且熟练应用,STL函数库的熟练应用是每个ACMer和OLer的必备技能,惭愧的是,我现在还没能完全掌握STL库,只能应用一部分,相信在日后的学习中STL的使用会越来越熟练。

我们简单介绍几个STL库:

#include<cctype>

加入这个头文件就可以调用以下函数:

1、isalpha(x) 判断x是否为字母

2、isdigit(x) 判断x是否为数字

3、islower(x) 判断x是否为小写字母

4、isupper(x) 判断x是否为大写字母

5、isalnum(x) 判断x是否为字母或数字

6、ispunct(x) 判断x是否为标点符号

7、isspace(x) 判断x是否为空格

对于以上函数,如果x符合条件的话,均会返回true,否则返回false

还有以下函数:

1、toupper(x) 如果x是小写字母,将其转换成大写字母

2、tolower(x) 如果x是大写字母,将其转换成小写字母

#include<string>

在本题目中用到的有以下几个函数,也是此头文件下比较常用的函数,更多的可以百度以下

1、s.erase(x,y) 表示将字符串s从x位置起删除y个字符

2、s.insert(x,y) 表示将字符串y(或字符y)插入到s的x位置处

3、s.push_back(x) 表示在s的末尾插入字符x

4、reverse(s.begin(),s.end()) 将字符串s翻转

还有数组vector,其实数组的操作和上述的几个差不多,stack栈的使用,queue,list,set,map,deque,multimap.....等等诸多STL的容器以及例如next_permutation,sort等诸多STL函数的使用。

这个题充分使用了STL库并且将容器的作用发挥到极致。

在此中,为了实现cin,cout输入输出流的快速使用以达到节省时间的目的,我们应用了快速输入输出流:ios::sync_with_stdio(false),这样我们就可以随心所欲的使用cin与cout,不用在担心时间的浪费问题。

还有一个细节要注意的是,大量的使用for循环可能复杂度会大大的增加,我们在此使用register定义变量流来获取时间的一种节约,使用register修饰的变量可以提高它的读写速度,一般用于多层循环中。

这个题细节太多了,学到的知识也太多了,不得不说,这个题很有质量,我在此中收获了不少,也再次见证了STL的简便性和威力。

不多解释了,详细的注意事项和代码如下:

 1 #include<bits/stdc++.h>
2 using namespace std;
3 int main(){
4 ios::sync_with_stdio(false);//快速输入输出流
5 int p1,p2,p3;
6 string s;
7 cin>>p1>>p2>>p3>>s;
8 for(register int i=1;i<s.length()-1;i++){
9 //从第二个元素到倒数第二的元素,其余的是负号就直接不用管了
10 if(s[i]=='-'&&((islower(s[i-1])&&islower(s[i+1])&&s[i-1]<s[i+1])||(isdigit(s[i-1])&&isdigit(s[i+1])&&s[i-1]<s[i+1])))//超长判断
11 {
12 if(p1==1){
13 s.erase(s.begin()+i);//删除负号
14 string a;//定一个空的字符串用来操作
15 for(register int k=s[i-1]+1;k<=s[i]-1;k++)
16 {//按ascii码顺序
17 char ch=k;//用来插入
18 for(register int j=1;j<=p2;j++) //插入p2个
19 a.push_back(ch);//插到空字符串的队尾
20 }
21 if(p3==2)
22 reverse(a.begin(),a.end());//调换
23 s.insert(i,a);//把操作完成的字符串插到删除负号的地方
24 }
25 else if(p1==2){
26 s.erase(s.begin()+i);//删除负号
27 string a;//定义一个空字符串来操作
28 for(register int k=s[i-1]+1;k<=s[i]-1;k++)//按ASCII码顺序
29 {
30 char ch=k;//用来插入的字符
31 ch=toupper(ch);//转大写
32 for(register int j=1;j<=p2;j++)
33 a.push_back(ch);//同上
34 }
35 if(p3==2)
36 reverse(a.begin(),a.end());
37 s.insert(i,a);
38 }
39 else if(p1==3){
40 s.erase(s.begin()+i);
41 string a;
42 for(register int k=s[i-1]+1;k<=s[i]-1;k++)
43 for(register int j=1;j<=p2;j++)
44 a.push_back('*');//插入 “*”
45 if(p3==2)
46 reverse(a.begin(),a.end());//翻转
47 s.insert(i,a);
48 }
49 }
50 }
51 cout<<s<<endl;
52 return 0;
53 }

洛谷P1098 [NOIP2007 提高组] 字符串的展开的更多相关文章

  1. 洛谷 P2678 & [NOIP2015提高组] 跳石头

    题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...

  2. 洛谷 P1025 & [NOIP2001提高组] 数的划分(搜索剪枝)

    题目链接 https://www.luogu.org/problemnew/show/P1025 解题思路 一道简单的dfs题,但是需要剪枝,否则会TLE. 我们用dfs(a,u,num)来表示上一个 ...

  3. 洛谷P1514 [NOIP2010提高组T4]引水入城

    P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城 ...

  4. 洛谷P1084 [NOIP2012提高组Day2T3]疫情控制

    P1084 疫情控制 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控 ...

  5. 洛谷P1083 [NOIP2012提高组Day2T2]借教室

    P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...

  6. 洛谷P1315 [NOIP2011提高组Day2T3] 观光公交

    P1315 观光公交 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号 ...

  7. 洛谷P1313 [NOIP2011提高组Day2T1]计算系数

    P1313 计算系数 题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别 ...

  8. 洛谷P1312 [NOIP2011提高组Day1T3]Mayan游戏

    Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游 ...

  9. 洛谷P1003 [NOIP2011提高组Day1T1]铺地毯

    P1003 铺地毯 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号 ...

随机推荐

  1. spring boot + thymeleaf +security自定义规则 的简单使用

    1.前言 以前开发一直使用 springMVC模式开发 ,前端页面常使用 JSP  ,现在html5淘汰了 ,要么使用html ,要么使用vue , 现在使用spring boot ,有必要总结一下 ...

  2. Autofac实现有条件的DI

    Autofac.Annotation框架是我用.netcore写的一个DI框架,基于Autofac参考 Spring注解方式所有容器的注册和装配,切面,拦截器等都是依赖标签来完成. 开源地址:http ...

  3. vue备用

    handleCheck (item) { if (item.isChecked) { this.checkData.push(item.id) this.checkData = _.uniqWith( ...

  4. 网络协议学习笔记(二)物理层到MAC层,交换机和VLAN,ICMP与ping原理

    概述 之前网络学习笔记主要讲解了IP的诞生,或者说整个操作系统的诞生,一旦有了IP,就可以在网络的环境里和其他的机器展开沟通了.现在开始给大家讲解关于网络底层的相关知识. 从物理层到MAC层:如何在宿 ...

  5. ubuntu18.04下取消中键复制粘贴功能

    Q: armlinux开发,主机采用ubuntu18.04操作系统,使用过程中关于鼠标中键有如下操作现象, 操作: 1.选中文本, 2.将鼠标光标定位到要插入的位置 3.按下鼠标中键 现象:将自动复制 ...

  6. LATEX图片位置

    常用选项[htbp]是浮动格式: -『h』当前位置.将图形放置在正文文本中给出该图形环境的地方.如果本页所剩的页面不够,这一参数将不起作用. -『t』顶部.将图形放置在页面的顶部. -『b』底部.将图 ...

  7. 《剑指offer》面试题48. 最长不含重复字符的子字符串

    问题描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度.   示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串 ...

  8. .NET Core 自定义中间件 Middleware

    引言 很多看了上一章的朋友私信博主,问如何自定义,自己的中间件(Middleware),毕竟在实际的项目中,大家会有很多需求要用到中间件,比如防盗链.缓存.日志等等功能,于是博主这边就简单讲解一下框架 ...

  9. [Altium Designer 学习]怎样添加3D模型

    对于为给PCB添加3D模型,很多人觉得这是个绣花针的活,中看不中用.在我看来这也未必,特别是常用的3D模型能在网上下载的今天,只需要几个简单的操作,就能使你的PCB更加赏心悦目.除此之外,3D模型还有 ...

  10. Docker 私服

    目录 什么是 Docker 私服? Docker 私服搭建 上传镜像至私服 从私服拉取镜像 什么是 Docker 私服? Docker 官方的 Docker Hub 是一个用于管理公共镜像的仓库,我们 ...