码迷,mamicode.com
首页 > 其他好文 > 详细

NOIP2007字符串的展开

时间:2015-09-12 17:45:02      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

NOIP2007的第二道题目,个人感觉就是暴力去跑模拟就好了,数据范围是允许我们这样去跑程序的

题目简述:题目中会给你 三个关键字p1,p2,p3,对于不同的关键字会对你的程序提出要求,接下来会给你一个字符串,其中包含a-z,A-Z,0-9,以及减号-,我们需要做的就是按p1,p2,p3的要求对于“-”进行展开其中p1,p2,p3的具体要求如下:

(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”。

 

这就要看你跑模拟的技术了,如何将同类型归类,尽量减少代码长度,理清思路才是关键了,首先将最容易处理的部分弄出来,就是只输出减号或不做输出的部分特判出来,接下我首先对p3进行了分类,决定是正序或逆序输出,接下来是p1判断,对于大小写的改变,p2只要在输出时做循环就ok了。

接下来是一些细节:

(1) 首先我们不能够一边读一遍输出,我们要把答案装在一个out数组中,如果我们考虑极端情况例如a-za-za-za-z……最多出现33组,当p2取到最大的8时,那么结果长度将不小于33 * 24 + 8 +(100 - 3) = 6403,数组是一定要开的够大的。

(2) 数据中是有坑的,例如一个a-4,6-p,a--c这种,一定要小心,我也wa了3次才a了,实在是不容易啊

 

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>

using namespace std;

typedef long long ll;

bool number(char);
void insert(char,char);

char in[110],out[7000];
int p1,p2,p3,len = -1;

int main(){
    scanf("%d%d%d",&p1,&p2,&p3);
    cin.get();
    scanf("%s",&in);
    out[++len] = in[0];
    for (int i = 1;i < strlen(in); ++i)
        if (in[i] == -)
            insert(in[i - 1],in[i + 1]);
        else 
            out[++len] = in[i];
    puts(out);
    return 0;
}

bool number(char x){
    if (x <= 9 && x >= 0)    
        return 1;
    return 0;
}

void insert(char begin,char end){
    if (begin + 1 == end)    return ;
    if (begin >= end){
        out[++len] = -;
        return ;
    }
    if (begin == -){
        out[++len] = -;
        return ;
    }
    if (end == -){
        out[++len] = -;
        return ;
    }
    if (number(begin) && !number(end)){
        out[++len] = -;
        return;
    }
    if (p1 == 3){
        for (int i = begin + 1;i < end; ++i)
            for (int j = 0; j < p2; ++j)
                out[++len] = *;
        return ;
    }
    if (number(begin)){
        if (p3 == 1)
            for (int i = begin + 1;i < end; ++i)
                for (int j = 0;j < p2; ++j)
                    out[++len] = i;
        else 
            for (int i = end - 1;i > begin; --i)
                for (int j = 0;j < p2; ++j)
                    out[++len] = i;
    }
    else{
        if (p3 == 1)
            for (int i = begin + 1;i < end; ++i)
                for (int j = 0;j < p2; ++j)
                    if (p1 == 1)    out[++len] = i;
                    else             out[++len] = i - a + A;
        else 
            for (int i = end - 1;i > begin; --i)
                for (int j = 0;j < p2; ++j)
                    if (p1 == 1)    out[++len] = i;
                    else             out[++len] = i - a + A;
    }
    return ;
}

 

NOIP2007字符串的展开

标签:

原文地址:http://www.cnblogs.com/GENEVE/p/4803239.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!