NOIP2007字符串的展开

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 ;
}
时间: 2024-08-02 15:14:30

NOIP2007字符串的展开的相关文章

洛谷 P1098 字符串的展开(NOIp2007提高组T2)

题目描述 在初赛普及组的"阅读程序写结果"的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于"d-h"或者"4-8"的字串,我们就把它当作一种简写,输出时,用连续递增的字母或数字串替代其中的减号,即,将上面两个子串分别输出为"defgh"和"45678".在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活.具体约定如下: (1) 遇到下面的情况需要做字符串的展开:在输入的字

字符串的展开

30:字符串的展开    总时间限制:1000ms  内存限制:65536kB描述    在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母获数字串替代其中的减号,即,将上面两个子串分别输出为“defgh”和“45678”.在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活.具体约定如下:    (1) 遇到下面的情况需要做字符串的展开:在输入的字符串

AC日记——字符串的展开 openjudge 1.7 35

35:字符串的展开 总时间限制:  1000ms 内存限制:  65536kB 描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母获数字串替代其中的减号,即,将上面两个子串分别输出为“defgh”和“45678”.在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活.具体约定如下: (1) 遇到下面的情况需要做字符串的展开:在输入的字符串中,出现了

洛谷 P1098 字符串的展开

题目描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母或数字串替代其中的减号,即,将上面两个子串分别输出为“defgh”和“45678”.在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活.具体约定如下: (1) 遇到下面的情况需要做字符串的展开:在输入的字符串中,出现了减号“-”,减号两侧同为小写字母或同为数字,且按照ASCII码的顺序,减号右

Luogu P1098 字符串的展开

一道很麻烦的模拟题. /* P1098 字符串的展开 * Au: GG */ #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <cctype> #include <iostream> #include <algorithm> using namespace std; char s[103]; int n, p

noip200706字符串的展开

试题描述: 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母获数字串替代其中的减号,即,将上面两个子串分别输出为“defgh”和“45678”.在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活.具体约定如下: (1)遇到下面的情况需要做字符串的展开:在输入的字符串中,出现了减号“-”,减号两侧同为小写字母或同为数字,且按照ASCII码的顺序,减号右

洛谷1098 字符串的展开 解题报告

洛谷1098 字符串的展开 本题地址:http://www.luogu.org/problem/show?pid=1098 题目描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母获数字串替代其中的减号,即,将上面两个子串分别输出为“defgh”和“45678”.在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活.具体约定如下:(1) 遇到下面的情

字符串的展开题目

题目描述 给定一个字符串,字符串包含数字.大小写字母以及括号(包括大括号,中括号,小括号),括号可以嵌套,即括号里面可以出现数字和括号. 按照如下规则对字符串进行展开,不需要考虑括号不成对的问题,不考虑数字后面没有括号的情况,即 2a2(b)不考虑. 数字表示括号里的字符串重复的次数,展开后的字符串不包含括号 将字符串进行逆序展开 123 输入abc2{de3[fg]} 输出gfgfgfedgfgfgfedcba 解法 利用栈进行计算,每次判断此时是否是右括号,如果是的话,拿到对应的左括号之前的

P1098 字符串的展开

P1098 字符串的展开 刷新三观的模拟题 题意描述 太长了自己去看吧. 算法分析 模拟题分析你*呀! 写这篇题解的唯一原因是:三目运算符用的好的话,可以让百行大模拟变成30行水题. 代码实现 #include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> using namespace