洛谷—— P1098 字符串的展开

https://www.luogu.org/problem/show?pid=1098

题目描述

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

输入输出格式

输入格式:

输入文件expand.in包括两行:

第1行为用空格隔开的3个正整数,依次表示参数p1,p2,p3。

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

输出格式:

输出文件expand.out只有一行,为展开后的字符串。

输入输出样例

输入样例#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<=p1<=3,1<=p2<=8,1<=p3<=2。字符串长度不超过100

NOIP 2007 提高第二题

字符串模拟,数组开大、一如既往地不长眼

 1 #include <cstring>
 2 #include <cstdio>
 3 
 4 const int N(800010);
 5 char s[N],ans[N],tmp[N];
 6 int p[3],cnt;
 7 
 8 int Presist()
 9 {
10     for(int i=0; i<3; ++i) scanf("%d",p+i);
11     scanf("%s",s); int n=strlen(s);
12     for(int i=0; i<n; ++i)
13     {
14         if(s[i]!='-') ans[++cnt]=s[i];
15         else
16         {
17             if((int)s[i+1]<=(int)s[i-1])
18                 ans[++cnt]=s[i];
19             else
20             {
21                 if(s[i+1]>='a'&&s[i+1]<='z'&&s[i-1]>='a'&&s[i-1]<='z')
22                 {
23                     if(p[2]==1)
24                     {
25                         if(p[0]==3)
26                         {
27                             for(int j=s[i-1]-'a'+1; j<s[i+1]-'a'; ++j)
28                                 for(int k=1; k<=p[1]; ++k) ans[++cnt]='*';
29                         }
30                         if(p[0]==2)
31                           for(int j=s[i-1]-'a'+1; j<s[i+1]-'a'; ++j)
32                             for(int k=1;  k<=p[1]; ++k)    ans[++cnt]=j+'A';
33                         if(p[0]==1)
34                           for(int j=s[i-1]-'a'+1; j<s[i+1]-'a'; ++j)
35                             for(int k=1;  k<=p[1]; ++k)    ans[++cnt]=j+'a';
36                     }
37                     else
38                     {
39                         int nc=0;
40                         if(p[0]==3)
41                         {
42                             for(int j=s[i-1]-'a'+1; j<s[i+1]-'a'; ++j)
43                                 for(int k=1; k<=p[1]; ++k) tmp[++nc]='*';
44                         }
45                         if(p[0]==2)
46                           for(int j=s[i-1]-'a'+1; j<s[i+1]-'a'; ++j)
47                             for(int k=1;  k<=p[1]; ++k)    tmp[++nc]=j+'A';
48                         if(p[0]==1)
49                           for(int j=s[i-1]-'a'+1; j<s[i+1]-'a'; ++j)
50                             for(int k=1;  k<=p[1]; ++k)    tmp[++nc]=j+'a';
51                         for(int j=nc; j; --j) ans[++cnt]=tmp[j];
52                     }
53                 }
54                 else if(s[i+1]>='0'&&s[i+1]<='9'&&s[i-1]>='0'&&s[i-1]<='9')
55                 {
56                     if(p[2]==1)
57                     {
58                         if(p[0]==3)
59                         {
60                             for(int j=s[i-1]-'0'+1; j<s[i+1]-'0'; ++j)
61                                 for(int k=1; k<=p[1]; ++k) ans[++cnt]='*';
62                         }
63                         else for(int j=s[i-1]-'0'+1; j<s[i+1]-'0'; ++j)
64                                 for(int k=1; k<=p[1]; ++k) ans[++cnt]=j+'0';
65                     }
66                     else
67                     {
68                         int nc=0;
69                         if(p[0]==3)
70                         {
71                             for(int j=s[i-1]-'0'+1; j<s[i+1]-'0'; ++j)
72                                 for(int k=1; k<=p[1]; ++k) tmp[++nc]='*';
73                         }
74                         else for(int j=s[i-1]-'0'+1; j<s[i+1]-'0'; ++j)
75                                 for(int k=1; k<=p[1]; ++k) tmp[++nc]=j+'0';
76                         for(int j=nc; j; --j) ans[++cnt]=tmp[j];
77                     }
78                 }
79                 else ans[++cnt]=s[i];
80             }
81         }
82     }
83     for(int i=1; i<=cnt; ++i) printf("%c",ans[i]);
84     return 0;
85 }
86 
87 int Aptal=Presist();
88 int main(int argc,char**argv){;} 
——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
原文地址:https://www.cnblogs.com/Shy-key/p/7688631.html