洛谷 P1098 【字符串的展开】

【题目描述】

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

输出

2 3 2
a-d-d

不得不说,这题花了我很多时间。原因是什么呢?没认真看题目,一直漏条件。

总结了一下,主要是这几点:

1.前后都要是小写字母或者数字才可以展开

2.是后继就删掉“-”

3.p2=2时,数字是不需要“变大写的”

4.如果减号前面的比后面的大,就保留“-”

清楚了这些,这题就不难,几个for+if暴力解决,上代码。

#include<bits/stdc++.h>
using namespace std;
int a,b,c;
char s[105];
int main()
{
    scanf("%d%d%d",&a,&b,&c);
    scanf("%s",s+1);
    int len=strlen(s+1);
    for(int i=1;i<=len;i++)
    {
        if(s[i]=='-')
        {
            if((s[i-1]>='0'&&s[i-1]<='9'&&s[i+1]>='0'&&s[i+1]<='9')||(s[i-1]>='a'&&s[i-1]<='z'&&s[i+1]>='a'&&s[i-1]<='z'))//前后都是数字或都是字符
            {
              if(s[i-1]==s[i+1]-1) continue;//是后继就不管他
              if(c==1)
              {
                int start=int(s[i-1]),end=int(s[i+1]);
                for(int j=start+1;j<end;j++)
                {
                    if(a==1)
                      for(int k=1;k<=b;k++) 
                        cout<<char(j);
                    if(a==2)
                      for(int k=1;k<=b;k++)
                      {
                        if(s[i-1]<='9'&&s[i+1]>='0') cout<<char(j);//是数字就就没必要变大写
                        else cout<<char(j+'A'-'a');
                      }
                    if(a==3)
                      for(int k=1;k<=b;k++)
                        cout<<"*";
                }
                if(start>=end) cout<<"-";
              }
              if(c==2)
              {
                int start=int(s[i-1]),end=int(s[i+1]);
                for(int j=end-1;j>start;j--)
                {
                    if(a==1)
                      for(int k=1;k<=b;k++) 
                        cout<<char(j);
                    if(a==2)
                      for(int k=1;k<=b;k++)
                      {
                        if(s[i-1]<='9'&&s[i+1]>='0') cout<<char(j); 
                        else cout<<char(j+'A'-'a');
                      }  
                    if(a==3)
                      for(int k=1;k<=b;k++)
                        cout<<"*";
                }
                if(start>=end) cout<<"-";//基本同上
              }
            }
            else cout<<"-";不满足的话就保留
        }
        else cout<<s[i];//输出当下的字符
    }
    return 0;
} 

 

posted @ 2019-08-09 22:27  crxscp-173  阅读(122)  评论(0编辑  收藏  举报