CODE[VS] 1165 字符串的展开 || 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】
1 2 1
abcs-w1234-9s-4zz
【输入输出样例2】
2 3 2
a-d-d
【输入输出样例3】
3 4 2
di-jkstra2-6
【输入输出样例1】
abcsttuuvvw1234556677889s-4zz
【输入输出样例2】
aCCCBBBd-d
【输入输出样例3】
dijkstra2************6
【限制】
40%的数据满足:字符串长度不超过5
100%的数据满足:1<=p1<=3, 1<=p2<=8, 1<=p3<=2。字符串长度不超过100
zhei就是一个模拟,字符串。
但模拟的思路,过程有很多种。
就是要注意把所有的特殊情况都考虑全面了吧。
ac代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 using namespace std; 7 int x,y,z; 8 char c[105]; 9 int main() 10 { 11 scanf("%d%d%d",&x,&y,&z); 12 cin>>c+1; 13 int l=strlen(c+1); 14 for(int i=1; i<=l; i++) 15 { 16 if(c[i]=='-'&&i==1) 17 { 18 printf("%c",c[i]); 19 continue; 20 } 21 if(c[i]=='-'&&c[i+1]=='-'||c[i]=='-'&&c[i-1]=='-') 22 { 23 printf("-"); 24 continue; 25 } 26 if(c[i]=='-'&&i==l) 27 { 28 printf("-"); 29 return 0; 30 } 31 if(c[i]!='-') 32 printf("%c",c[i]); 33 else 34 { 35 if((c[i-1]>=48&&c[i-1]<=57&&c[i+1]>=97)||(c[i-1]>=97&&c[i+1]>=48&&c[i+1]<=57)) 36 printf("%c",c[i]); 37 else 38 { 39 if(c[i+1]==c[i-1]+1) continue; 40 if(c[i-1]>=c[i+1]) 41 printf("%c",c[i]); 42 if(x==1&&z==1) 43 for(int j=c[i-1]+1; j<c[i+1]; j++) 44 for(int k=1; k<=y; k++) 45 printf("%c",j); 46 if(x==1&&z==2) 47 for(int j=c[i+1]; j>c[i-1]+1; j--) 48 for(int k=1; k<=y; k++) 49 printf("%c",j); 50 if(x==2&&z==1) 51 { 52 if(c[i-1]>=48&&c[i-1]<=57) 53 for(int j=c[i-1]+1; j<c[i+1]; j++) 54 for(int k=1; k<=y; k++) 55 printf("%c",j); 56 else 57 { 58 for(int j=c[i-1]+1-32; j<c[i+1]-32; j++) 59 for(int k=1; k<=y; k++) 60 printf("%c",j); 61 } 62 } 63 if(x==2&&z==2) 64 { 65 if(c[i-1]>=48&&c[i-1]<=57) 66 for(int j=c[i+1]-1; j>c[i-1]; j--) 67 for(int k=1; k<=y; k++) 68 printf("%c",j); 69 else 70 { 71 for(int j=c[i+1]-32-1; j>c[i-1]-32; j--) 72 for(int k=1; k<=y; k++) 73 printf("%c",j); 74 } 75 } 76 if(x==3) 77 for(int j=c[i-1]+1-32; j<c[i+1]-32; j++) 78 for(int k=1; k<=y; k++) 79 printf("*"); 80 } 81 } 82 } 83 return 0; 84 }