标签:
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 ; }
标签:
原文地址:http://www.cnblogs.com/GENEVE/p/4803239.html