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

    题目描述

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

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

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

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

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

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

    输入输出格式

    输入格式:

     

    共两行。

    第 11 行为用空格隔开的 33 个正整数,依次表示参数 p_1,p_2,p_3p1,p2,p3 。

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

     

    输出格式:

     

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

     

    输入输出样例

    输入样例#1: 复制
    1 2 1
    abcs-w1234-9s-4zz
    
    
    输出样例#1: 复制
    abcsttuuvvw1234556677889s-4zz
    
    
    输入样例#2: 复制
    2 3 2
    a-d-d
    输出样例#2: 复制
    aCCCBBBd-d

    说明

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

    100\%100% 的数据满足: 1 le p_1 le 3,1 le p_2 le 8,1 le p_3 le 21p13,1p28,1p32 。字符串长度不超过 100100

    NOIP 2007 提高第二题

     

    模拟

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    
    int p1,p2,p3,len;
    
    char s[120];
    
    int main() {
        scanf("%d%d%d",&p1,&p2,&p3);
        scanf("%s",s+1);
        len=strlen(s+1);
        s[0]='#';s[len+1]='#';
        for(int i=1; i<=len; i++) {
            if(s[i]!='-') {
                cout<<s[i];
                continue;
            }
            if(s[i+1]-s[i-1]==1)continue;
            if(s[i-1]>='0'&&s[i-1]<='9'&&s[i+1]>='0'&&s[i+1]<='9') {
                if(s[i+1]<=s[i-1]) {
                    cout<<s[i];
                    continue;
                }
                if(p1==3) {
                    for(int j=s[i-1]+1; j<s[i+1]; j++)
                        for(int k=1; k<=p2; k++)
                            cout<<"*";
                    continue;
                }
                if(p3==1) {
                    for(int j=s[i-1]+1; j<s[i+1]; j++)
                        for(int k=1; k<=p2; k++)
                            cout<<char(j);
                    continue;
                }
                if(p3==2) {
                    for(int j=s[i+1]-1; j>=s[i-1]+1; j--)
                        for(int k=1; k<=p2; k++)
                            cout<<char(j);
                    continue;
                }
            }
            if(s[i-1]>='a'&&s[i-1]<='z'&&s[i+1]>='a'&&s[i+1]<='z') {
                if(s[i+1]<=s[i-1]) {
                    cout<<s[i];
                    continue;
                }
                if(p1==3) {
                    for(int j=s[i-1]+1; j<s[i+1]; j++)
                        for(int k=1; k<=p2; k++)
                            cout<<"*";
                    continue;
                }
                if(p3==1) {
                    if(p1==1) {
                        for(int j=s[i-1]+1; j<s[i+1]; j++)
                            for(int k=1; k<=p2; k++)
                                cout<<char(j);
                        continue;
                    }
                    if(p1==2) {
                        for(int j=s[i-1]+1; j<s[i+1]; j++)
                            for(int k=1; k<=p2; k++)
                                cout<<char(j-32);
                        continue;
                    }
    
                }
                if(p3==2) {
                    if(p1==1) {
                        for(int j=s[i+1]-1; j>=s[i-1]+1; j--)
                            for(int k=1; k<=p2; k++)
                                cout<<char(j);
                        continue;
                    }
                    if(p1==2) {
                        for(int j=s[i+1]-1; j>=s[i-1]+1; j--)
                            for(int k=1; k<=p2; k++)
                                cout<<char(j-32);
                        continue;
                    }
    
                }
            }
            cout<<s[i];
        }
        return 0;
    }
  • 相关阅读:
    leetcode 18 4Sum
    leetcode 71 Simplify Path
    leetcode 10 Regular Expression Matching
    leetcode 30 Substring with Concatenation of All Words
    leetcode 355 Design Twitte
    leetcode LRU Cache
    leetcode 3Sum
    leetcode Letter Combinations of a Phone Number
    leetcode Remove Nth Node From End of List
    leetcode Valid Parentheses
  • 原文地址:https://www.cnblogs.com/zzyh/p/9337062.html
Copyright © 2011-2022 走看看