[NOIP2007] 字符串的展开

来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,
其他语言524288K 64bit IO Format:%lld


题目描述

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


WA:

#include <iostream>
#include <algorithm>
#include <cctype>
#include <cstring>
#include <cstdio>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    int p1, p2, p3;
    cin >> p1 >> p2 >> p3;
    string str;
    cin >> str;
    int len = str.size();
    cin.tie(0);
    cout.tie(0);
    for (int i = 0; i < len; i++)
    {
        if (str[i] == '-')
        {
            if (str[i - 1] >= str[i + 1])
                cout << str[i];
            else if (str[i - 1] + 1 == str[i + 1])
            {
                if (str[i] != '-')
                    cout << str[i];
            }
            else
            {
                if ((isalpha(str[i - 1]) && isalpha(str[i + 1])) || (isdigit(str[i - 1]) && isdigit(str[i + 1])))
                {
                    if (p1 == 1)
                    {
                        int cnt = str[i + 1] - str[i - 1] - 1;
                        if (p3 == 1)
                        {
                            for (int j = 1; j <= cnt; j++)
                            {
                                for (int k = 0; k < p2; k++)
                                {
                                    cout << char(str[i - 1] + j);
                                }
                            }
                        }
                        else if(p3 == 2)
                        {
                            for (int j = cnt; j > 0;j--)
                            {
                                for (int k = 0; k < p2;k++)
                                {
                                    cout << char(str[i + 1] - j);
                                }
                            }
                        }
                    }
                    if (p1 == 2)
                    {
                        int cnt = str[i + 1] - str[i - 1] - 1;
                        if(p3 == 1)
                        {
                            for (int j = 1; j <= cnt;j++)
                            {
                                for (int k = 0; k < p2;k++)
                                {
                                    cout << char(str[i - 1] + j - 32);
                                }
                            }
                        }
                        if(p3 == 2)
                        {
                            for (int j = cnt; j > 0;j--)
                            {
                                for (int k = 0; k < p2;k++)
                                {
                                    cout << char(str[i + 1] - j - 32);
                                }
                            }
                        }
                    }
                    if(p1 == 3)
                    {
                        int cnt = str[i + 1] - str[i - 1] - 1;
                        for (int j = 1; j <= cnt;j++)
                        {
                            for (int k = 0; k < p2; k++)
                            {
                                cout << "*";
                            }
                        }
                    }
                }
            }
        }
        else if(str[i] != '-')
            cout << str[i];
    }
    return 0;
}

WA


AC:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstring>
#include <cctype>
using namespace std;
int p1, p2, p3, cnt;
int main()
{
    string str;
    cin >> p1 >> p2 >> p3;
    cin >> str;
    for (int i = 0; i < str.size(); i++)
    {
        if (str[i] != '-')
        {
            cout << str[i];
        }
        else if ((isalpha(str[i - 1]) && isalpha(str[i + 1])) || (isdigit(str[i - 1]) && isdigit(str[i + 1])))
        {
            if (str[i + 1] <= str[i - 1])
            {
                cout << str[i];
            }
            else if (str[i + 1] - str[i - 1] == 1)
            {
                if (str[i] != '-')
                    cout << str[i];
            }
            else
            {
                if (p1 == 1)
                {
                    cnt = str[i + 1] - str[i - 1] - 1;
                    if (p3 == 1) //顺序
                    {
                        for (int j = 1; j <= cnt; j++)
                        {
                            for (int k = 0; k < p2; k++)
                            {
                                cout << char(str[i - 1] + j);
                            }
                        }
                    }
                    else if (p3 == 1) //逆序
                    {
                        for (int j = 1; j <= cnt; j++)
                        {
                            for (int k = 0; k < p2; k++)
                            {
                                cout << char(str[i + 1] - j);
                            }
                        }
                    }
                }
                else if (p1 == 2)
                {
                    cnt = str[i + 1] - str[i - 1] - 1;
                    if (p3 == 1) //顺序
                    {
                        for (int j = 1; j <= cnt; j++)
                        {
                            for (int k = 0; k < p2; k++)
                            {
                                if (isalpha(str[i - 1]))
                                {
                                    cout << char(str[i - 1] + j - 32);
                                }
                                else
                                {
                                    cout << char(str[i - 1] + j);
                                }
                            }
                        }
                    }
                    else if (p3 == 2) //逆序
                    {
                        for (int j = 1; j <= cnt; j++)
                        {
                            for (int k = 0; k < p2; k++)
                            {
                                if (isalpha(str[i - 1]))
                                {
                                    cout << char(str[i + 1] - j - 32);
                                }
                                else
                                {
                                    cout << char(str[i + 1] - j);
                                }
                            }
                        }
                    }
                }
                else if (p1 == 3) //填充 '*'
                {
                    cnt = str[i + 1] - str[i - 1] - 1;
                    for (int j = 1; j <= cnt; j++)
                    {
                        for (int k = 0; k < p2; k++)
                        {
                            cout << "*";
                        }
                    }
                }
            }
        }
        else
        {
            cout << str[i];
        }
    }
    return 0;
}

AC

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值