[NOIP2007]字符串的展开

简介: [NOIP2007]字符串的展开

在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“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

输入

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

1 2 1

abcs-w1234-9s-4zz


输出

复制abcsttuuvvw1234556677889s-4zz

abcsttuuvvw1234556677889s-4zz


示例2

输入

复制2 3 2 a-d-d

2 3 2

a-d-d


输出

复制aCCCBBBd-d

aCCCBBBd-d


示例3

输入

复制3 4 2 di-jkstra2-6

3 4 2

di-jkstra2-6


输出

复制dijkstra2************6

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


#include<bits/stdc++.h>
using namespace std;
int main()
{
    int p1,p2,p3,i=0;
    string s;
    cin>>p1>>p2>>p3>>s;
    while(s[i])
    {
        char l=s[i-1],r=s[i+1];
        char x=s[i];
        if(x=='-'&&r>l&&(isdigit(l)&&isdigit(r)||islower(l)&&islower(r)))
        {
            if(p3==1)
            {
                for(char j=l+1;j<r;j++)
                {
                    char ch=j;
                    if(p1==2) ch=(ch>='a')? ch-32:ch;
                    else if(p1==3) ch='*';
                    for(int k=0;k<p2;k++) cout<<ch;
                }
            }
            else
            {
                for(char j=r-1;j>l;j--)
                {
                    char ch=j;
                    if(p1==2) ch=(ch>='a')?ch-32:ch;
                    else if(p1==3) ch='*';
                    for(int k=0;k<p2;k++) cout<<ch;
                }
            }
        }
        else cout<<x;
        i++;
    }
    return 0;
}
目录
相关文章
|
5月前
|
C++
【洛谷 P1307】[NOIP2011 普及组] 数字反转 题解(字符串)
**NOIP2011普及组题目:给定整数N,反转其位得到新数。新数首位非0(除非N=0)。输入0时直接输出0,其他情况输出反转后的数,考虑负数及前导0。提供的C++代码实现通过读入字符串,反转数字顺序并处理符号和前导0。**
31 0
|
4月前
【洛谷】P1308 [NOIP2011 普及组] 统计单词数
然后要被查找的b字符串,可能会出现第二个样例中的情况,也就是字符串a是to,而字符串b的Ottoman,这样是不符合题意的。为了 解决这个问题,我们将字符串a首尾都加一个空格,同时将字符串b首尾都加一个空格(这里是为了让字符串b的首单词和尾单词前后均有空格)为了能持续找字符串b中的所有字符串a,我们用一个while循环,如果能找到,就每次从能找到的位置的下一个位置(也就是能找到的位置下标+1)开始找,并及时更新位置,同时计数。因为不区分大小写,所以可以将两个字符串a,b都转为小写(也可以都转为大写)。
132 10
【洛谷】P1308 [NOIP2011 普及组] 统计单词数
|
4月前
|
C++ 索引
2269. 找到一个数字的 K 美丽值C++
2269. 找到一个数字的 K 美丽值C++
|
5月前
|
C++
【洛谷 P1059】[NOIP2006 普及组] 明明的随机数 题解(集合)
**NOIP2006普及组题目**,明明需生成不重复的1-1000间随机整数,输入含两行:第一行是整数N(≤100),第二行是N个随机数。输出两行,第一行是唯一数的个数M,第二行是排序后的唯一数。示例:输入10个数含重复,输出8个不同数排序后结果。解题方法:利用C++的`set`进行去重和排序。
61 0
|
5月前
|
存储
【洛谷 P2141】[NOIP2014 普及组] 珠心算测验 题解(集合+多重循环)
**NOIP2014普及组的珠心算测验题要求参赛者找出给定集合中多少个数可表示为其他两个不同数的和。输入含n个正整数,输出满足条件的数的个数。样例输入4个数,输出2,因1+2=3且1+3=4。代码利用集合存储和,遍历所有数对组合,当找到匹配和时插入集合,最后输出集合大小。注意数据规模为n≤100,数不超过10,000。**
125 0
|
算法 搜索推荐 程序员
C语言第十六练——数字组合匹配
C语言第十六练——数字组合匹配
119 0
|
C++
【力扣·每日一题】1576. 替换所有的问号(C++ 字符串模拟 思维)
【力扣·每日一题】1576. 替换所有的问号(C++ 字符串模拟 思维)
78 0
【力扣·每日一题】1576. 替换所有的问号(C++ 字符串模拟 思维)
LeetCode每日一题——902. 最大为 N 的数字组合
给定一个按 非递减顺序 排列的数字数组 digits 。你可以用任意次数 digits[i] 来写的数字。例如,如果 digits = [‘1’,‘3’,‘5’],我们可以写数字,如 ‘13’, ‘551’, 和 ‘1351315’。
97 0
LeetCode每日一题——902. 最大为 N 的数字组合
贤鱼的刷题日常--P1019 [NOIP2000 提高组] 单词接龙--题目详解
🍀学习了解P1019 [NOIP2000 提高组]单词接龙--题目详解
131 0
贤鱼的刷题日常--P1019 [NOIP2000 提高组] 单词接龙--题目详解