b163. NOIP2007 2.字符串的展开@Morris' Blog|PChome Online 人新台
2011-08-24 16:45:28| 人474| 回0 | 上一篇 | 下一篇

b163. NOIP2007 2.字符串的展开

0 收藏 0 0 站台

b163. NOIP2007 2.字符串的展开

容 :

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

5)如果减号右边的字符恰好是左边字符的后继,只删除中间的减号,例如:“d-e”应输出为“de”,“3-4”应输出为“34”。如果减号右边的字符按照ASCII码的顺序小于或等于左边字符,输出时,要保留中间的减号,例如:“d-d”应输出为“d-d”,“3-1”应输出为“3-1”。

入明 :

每输入包括两行:

1行为用空格隔开的3个正整数,依次表示参数p1p2p3

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

出明 :

每输出只有一行,为展开后的字符串

例入 :

1 2 1 abcs-w1234-9s-4zz 2 3 2 a-d-d 3 4 2 di-jkstra2-6 

例出 :

abcsttuuvvw1234556677889s-4zz aCCCBBBd-d dijkstra2************6

提示 :

40%的数据满足:字符串长度不超过5
100%的数据满足:1<=p1<=3, 1<=p2<=8, 1<=p3<=2。字符串长度不超过100

出 :

2007 NOIP 提高


作法 : 模
很不巧地度始定太短, 吃了 RE

/**********************************************************************************/
/*  Problem: b163 "NOIP2007 2.字符串的展开" from 2007 NOIP 提高        */
/*  Language: C                                                                   */
/*  Result: AC (1ms, 197KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-08-24 16:42:50                                     */
/**********************************************************************************/


#include<stdio.h>
#include<string.h>
main() {
    int p1, p2, p3, a, b, c;
    while(scanf("%d %d %d", &p1, &p2, &p3) == 3) {
        char s[30000], Ans[30000];
        int AIdx = 0, st, ed, flag;
        scanf("%s", s);
        for(a = 0; s[a]; a++) {
            if(s[a] == '-') {
                if(s[a-1] >= s[a+1]) {
                    Ans[AIdx++] = s[a], Ans[AIdx++] = s[a+1];
                    a++;
                } else {
                    if(s[a-1]+1 == s[a+1])
                        {continue;}
                    if(!(((s[a-1] >= '0' && s[a-1] <= '9') && (s[a+1] >= '0' && s[a+1] <= '9')) ||
                    ((s[a-1] >= 'a' && s[a-1] <= 'z') && (s[a+1] >= 'a' && s[a+1] <= 'z')) ||
                    ((s[a-1] >= 'A' && s[a-1] <= 'Z') && (s[a+1] >= 'A' && s[a+1] <= 'Z')))
                    ) {Ans[AIdx++] = s[a];continue;}
                    if(p3 == 1)
                        st = s[a-1]+1, ed = s[a+1], flag = 1;
                    else
                        st = s[a+1]-1, ed = s[a-1], flag = -1;
                    for(b = st; ;) {
                        if(p1 == 3) {
                            for(c = 0; c < p2; c++)
                                Ans[AIdx++] = '*';
                        } else {
                            if(b >= '0' && b <= '9') {
                                for(c = 0; c < p2; c++)
                                    Ans[AIdx++] = b;
                            }
                            if(p1 == 1 && (b >= 'a' && b <= 'z' || b >= 'A' && b <= 'Z'))
                                for(c = 0; c < p2; c++)
                                    Ans[AIdx++] = b >= 'a' ? b : (b - 'A' + 'a');
                            if(p1 == 2 && (b >= 'a' && b <= 'z' || b >= 'A' && b <= 'Z'))
                                for(c = 0; c < p2; c++)
                                    Ans[AIdx++] = b >= 'a' ? b - 'a' + 'A' : b;
                        }
                        b += flag;
                        if(p3 == 1 && b >= ed) break;
                        if(p3 == 2 && b <= ed) break;
                    }
                }
            }
            else {
                Ans[AIdx++] = s[a];
            }
        }
        Ans[AIdx]  = '\0';
        puts(Ans);
    }
    return 0;
}

台: Morris
人(474) | 回(0)| 推 (0)| 收藏 (0)|
全站分: 不分 | 人分: |
此分下一篇:d598. 3. (粗糙造版本)
此分上一篇:b113. 6. 性系求解

是 (若未登入"人新台"看不到回覆唷!)
* 入:
入片中算式的果(可能0) 
(有*必填)
TOP
全文
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86