洛谷P1098 [NOIP2007 提高组] 字符串的展开
题目链接: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 提高组] 字符串的展开的更多相关文章
- 洛谷 P2678 & [NOIP2015提高组] 跳石头
		题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ... 
- 洛谷 P1025 & [NOIP2001提高组] 数的划分(搜索剪枝)
		题目链接 https://www.luogu.org/problemnew/show/P1025 解题思路 一道简单的dfs题,但是需要剪枝,否则会TLE. 我们用dfs(a,u,num)来表示上一个 ... 
- 洛谷P1514 [NOIP2010提高组T4]引水入城
		P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城 ... 
- 洛谷P1084 [NOIP2012提高组Day2T3]疫情控制
		P1084 疫情控制 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控 ... 
- 洛谷P1083 [NOIP2012提高组Day2T2]借教室
		P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ... 
- 洛谷P1315 [NOIP2011提高组Day2T3] 观光公交
		P1315 观光公交 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号 ... 
- 洛谷P1313 [NOIP2011提高组Day2T1]计算系数
		P1313 计算系数 题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别 ... 
- 洛谷P1312 [NOIP2011提高组Day1T3]Mayan游戏
		Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游 ... 
- 洛谷P1003 [NOIP2011提高组Day1T1]铺地毯
		P1003 铺地毯 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号 ... 
随机推荐
- 【JAVA今法修真】 第八章 仙道万维网 圣地元宇宙
			您好,我是南橘,万法仙门的掌门,刚刚从九州世界穿越到地球,因为时空乱流的影响导致我的法力全失,现在不得不通过这个平台向广大修真天才们借去力量.你们的每一个点赞,每一个关注都是让我回到九州世界的助力,兄 ... 
- unittest+ddt_实现数据驱动测试(7)
			我们设计测试用例时,会出现测试步骤一样,只是其中的测试数据有变化的情况,比如测试登录时的账号密码.这个时候,如果我们依然使用一条case一个方法的话,会出现大量的代码冗余,而且效率也会大大降低.此时, ... 
- spring-aop(二)学习笔记
			常用增强处理类型 增强处理类型 特点 before 前置增强处理,在目标方法前织入增强处理 ... 
- HBase环境搭建(hbase1.2.5+zookeeper3.4.6)
			注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6627857018461880836/ 系统版本,Hadoop已安装完成 Mysql安装完成 Hive版本 Sqoo ... 
- MongoDB之几种情况下的索引选择策略
			一.MongoDB如何选择索引 如果我们在Collection建了5个index,那么当我们查询的时候,MongoDB会根据查询语句的筛选条件.sort排序等来定位可以使用的index作为候选索引:然 ... 
- T-SQL创建数据库常用方法2020年10月29日20:12:04网课笔记
			2.接口的作用 第一.方便框架的设计.利于团队的开发. 第二.方便项目拓展.高内聚.低耦合. 3.反射 [1]反射的理解:通过读取程序集的信息,找到相关的类型和类型的成员,也可以得到相关的对象.而这种 ... 
- MINItest软件架构总结
			MINItest软件架构总结 ----helloWen MINItest软件架构总结1. Problem Description2. Analysis3. Solution3.1. 通过读取设备信息来 ... 
- linux 安装 elasticsearch 步骤及问题解决方案
			1.下载安装包并上传至服务器 2.解压至当前文件夹 tar -xzvf xxx.tar.gz 3.配置JDK 如果服务器上已经配置了JDK,则在解压后的elasticsearch 文件夹的bin 目录 ... 
- leetcode 347. 前 K 个高频元素
			问题描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums ... 
- .NET下如何拦截鼠标、键盘消息?Win32NET来帮你
			Win32NET是一个Win32API的.NET下封装的类库,包含: 1: 常用win32的API的net封装 2:鼠标.键盘.热键hook钩子模块, 3:模拟键盘输入文字(支持各种字符文字.不同语言 ... 
