首页 > 其他分享 >字符串的展开

字符串的展开

时间:2023-07-24 20:14:27浏览次数:34  
标签:输出 p1 p3 减号 字符 字符串 展开

1848:【07NOIP提高组】字符串的展开


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 1091     通过数: 481

【题目描述】

在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“D-H”或“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母或数字串代替其中的减号,即,将上面的两个字串分别输出为defgh和45678在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活。具体规定如下:

(1)遇到下面的情况需要做字符串的展开,在输入字符串中,出现了减号“-”,减号两侧同为小写字母或同为数字,且按照ASCII码的顺序,减号右边的字符严格大于左边的字符。

(2)参数p1:展开方式,p1=1时,对于字母子串,填充小写字母;p1=2时,对于字母子串填充大写字母,这两种情况下数字子串的填充方式相同,p1=3时,不论是字母子串还是数字子串,都要与要填充的字母个数相等的星号“*”来补充。

(3)参数p2:填充字符的重复个数。p2=k表示同一个字符要连续填充k个。例如当P2=3时,字串“d-h”应扩展为“deeefffgggh”。减号两侧字符不变。

(4)参数p3:是否改为逆序:p3=1表示维持原有顺序,p3=2表示采用逆序输出,注意这时仍然不包括减号两端的字符。例如当p1=1、p2=2、p3=2时,字串"d-h”应扩展为“dggffeeh”。

(5)如果减号右边的字符恰好是左边宇符的后继,只删除中间的减号,例如:“d-e”应输出为“de”,"3-4"应输出为“34”。如果减号右边的字符按照ASCII码的顺序小于或等于左边字符,输出时,要保留中间的减号,例如“d-d”应输出为“d-d”,“3-1”应输出为“3-1”。

【输入】

包括两行:

第1行为用空格确开的3个正整数,依次表示参数p1,p2,p3。

第2行为一行字符串,仅由数字、小写字母和减号“-”。行首和行末均无空格。

【输出】

只有一行,为展开后的字符串组成。

【输入样例】

1 2 1
abcs-w1234-9s-4zz

【输出样例】

abcsttuuvvw1234556677889s-4zz

【提示】

【输入输出样例2】

输入:

2 3 2 
a-d-d

输出:

aCCCBBBd-d

【输入输出样例3】

输入:

3 4 2 
di-jkstra2-6 

输出:

dijkstra2************6

【限制】

40%的数据满足:字符串长度不超过5

100%的数据满足:1<=p1<=3,1<=p2<=8,1<=p3<=2。字符串长度不超过100

#include <bits/stdc++.h>
using namespace std;
int p1,p2,p3;
string S,Ans;
char ToChar(char ch){
	if(p1==3){
	    return '*';
	}
	return p1==1?tolower(ch):toupper(ch);
}
int main(){
	cin>>p1>>p2>>p3>>S;
	S=' '+S+' ';
	for(int i=1;i<S.size()-1;i++){
		if(S[i]!='-'){ 
			Ans+=S[i];
		}else{
			char s=S[i-1],t=S[i+1];
			if(s<t && (islower(s) && islower(t) || isdigit(s) && isdigit(t))){
				if(p3==1){ 
					for(char i=s+1; i<=t-1; i++){
						for(int j=0;j<p2;j++){ 
							Ans+=ToChar(i);
						} 
					} 
				}else{ 
					for(char i=t-1; i>=s+1; i--){
						for(int j=0; j<p2; j++){
							Ans+=ToChar(i);
						}
					}
				}
			}else{
				Ans+='-';
			}
		}
	}
	cout<<Ans<<endl;
	return 0;
}
  

  

 

 

标签:输出,p1,p3,减号,字符,字符串,展开
From: https://www.cnblogs.com/wangyueshuo/p/17578211.html

相关文章

  • 字符串的展开
    //字符串的展开#include<bits/stdc++.h>usingnamespacestd;intp1,p2,p3;stringS,Ans;charToChar(charch){if(p1==3){return'*';}returnp1==1?tolower(ch):toupper(ch);}intmain(){cin>>p1>>p2>>p3......
  • 字符串展开
    #include<bits/stdc++.h>usingnamespacestd;intp1,p2,p3;stringS,Ans;charToChar(charch){ if(p1==3){ return'*'; } returnp1==1?tolower(ch):toupper(ch);}intmain(){ cin>>p1>>p2>>p3>>S; S='�......
  • LeetCode 热题 100 之 438. 找到字符串中所有字母异位词
    题目给定两个字符串 s 和p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词指由相同字母重排列形成的字符串(包括相同的字符串)。示例 1:输入:s="cbaebabacd",p="abc"输出:[0,6]解释:起始索引等于0的子串是"cba"......
  • 4 字符串
    字符串1反转字符串题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组char[]的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。你可以假设数组中的所有字符都是ASCII码表中的可打印字符。示......
  • 康托展开及康托逆展开运算总结
    前文:这个东西是我准备进攻一道Astar算法的八数码题目时,遇到的。决定先搞懂这个,再进攻八数码(传说中那道不做人生不完整的题目)。 康托展开:百度百科给出的定义是:康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。康托展开的实质是计算当前排列在所有由小到大全......
  • 字典序相关字符串问题的 SAM 解法
    前文(SAM基础)如果你并不是很熟SAM,可以看看我远古时期的blog:浅析后缀自动机--Wallace--博客园(cnblogs.com)缘起为什么突然想到这个方面的东西,是因为在ZJU校队预组队时做到一个CF-GYM-100418C,当时一眼SA但实际上根本不熟。赛后发现有位国外老哥随手SAM暴打,一点都......
  • 转!XML文件和DOM Document、String字符串三种类型之间的相互转换
    转自:https://www.cnblogs.com/fightingdeng1998/p/16047075.html用的包是org.w3c.dom.Document下的/***@Authordengzp*@Date2022/3/22*@Version1.0*@Description*/publicclassOperateXMLByDOM{/***将给定文件的内容或者给定URI的内容解析......
  • Shell编程教程 - 字符串变量表达式
    1.字符串变量表达式基本比较示例脚本-`string_comparison.sh`字符串长度检查示例脚本-`string_length.sh`逻辑运算符连接表达式示例脚本-`logical_operators.sh`2.执行示例脚本3.结论大树哥个人信息本教程将向你介绍Shell脚本中字符串变量表达式的使用。我们将学习如何......
  • Day 4: Shell字符串处理
    学习目标学习内容1.字符串拼接2.字符串替换3.字符串截取4.练习任务大树哥个人信息学习目标学习Shell中的字符串处理技巧。掌握字符串的拼接、替换和截取方法。练习编写脚本,处理和操作字符串数据。学习内容今天我们将学习如何在Shell编程中处理和操作字符串。1.......
  • android 日期字符串转时间戳
    Android日期字符串转时间戳教程概述在Android开发中,经常会遇到将日期字符串转换为时间戳的需求。本文将向你介绍整个转换流程,并提供相应的代码示例。转换流程下面是将Android日期字符串转换成时间戳的一般流程,可以用表格展示如下:步骤描述1获取日期字符串2创建日......