洛谷 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; }