zoukankan      html  css  js  c++  java
  • 洛谷-P1098 字符串的展开

    洛谷-P1098 字符串的展开

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


    题目描述

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

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

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

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

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

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

    输入格式

    共两行。

    第1行为用空格隔开的3个正整数,依次表示参数(p_1,p_2,p_3)

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

    输出格式

    共一行,为展开后的字符串。

    输入输出样例

    输入 #1

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

    输出 #1

    abcsttuuvvw1234556677889s-4zz
    

    输入 #2

    2 3 2
    a-d-d
    

    输出 #2

    aCCCBBBd-d
    

    说明/提示

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

    100%的数据满足:(1 le p_1 le 3,1 le p_2 le 8,1 le p_3 le 2)。字符串长度不超过100

    NOIP 2007 提高第二题

    C++代码

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int main() {
        int p1,p2,p3,lena,i,j,k=1;
        char a[100],ans[10000],start,end;
        cin>>p1>>p2>>p3;
        cin>>a;
        lena=strlen(a);
        ans[0]=a[0];
        for(i=1;i<lena-1;++i) {
            if(a[i]=='-'&&(a[i-1]>='a'&&a[i-1]<='z'&&a[i+1]>='a'&&a[i+1]<='z'&&a[i-1]<a[i+1]
                        ||a[i-1]>='0'&&a[i-1]<='9'&&a[i+1]>='0'&&a[i+1]<='9'&&a[i-1]<a[i+1])) {
                if(p3==1) {
                    start=a[i-1]+1;
                    end=a[i+1];
                    if(p1==2&&start>'9') {
                        start+='A'-'a';
                        end+='A'-'a';
                    }
                    for(;start<end;++start)
                        for(j=0;j<p2;++j)
                            if(p1==3)
                                ans[k++]='*';
                            else
                                ans[k++]=start;
                }
                else {
                    start=a[i+1]-1;
                    end=a[i-1];
                    if(p1==2&&end>'9') {
                        start+='A'-'a';
                        end+='A'-'a';
                    }
                    for(;start>end;--start)
                        for(j=0;j<p2;++j)
                            if(p1==3)
                                ans[k++]='*';
                            else
                                ans[k++]=start;
                }
            }
            else
                ans[k++]=a[i];
        }
        ans[k++]=a[lena-1];
        for(i=0;i<k;++i)
            cout<<ans[i];
        cout<<endl;
        return 0;
    }
    
  • 相关阅读:
    linux同一客户端多个git账号的配置
    linux同一台机子上用多个git 账号
    执行ssh-add时出现Could not open a connection to your authentication agent
    国内常用NTP服务器地址及IP
    PHP双引号的隐患
    mysql 累加求和
    php实现Facebook风格的 time ago函数
    Mysql之数据库设计规范
    搭建Git服务器
    win7下如何根据端口号杀掉进程
  • 原文地址:https://www.cnblogs.com/yuzec/p/12742679.html
Copyright © 2011-2022 走看看