算法训练 字符串的展开  
时间限制:1.0s   内存限制:256.0MB
    
  在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“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
输入 输出
1 2 1
abcs-w1234-9s-4zz
abcsttuuvvw1234556677889s-4zz
输入输出样例2
输入 输出
2 3 2
a-d-d
aCCCBBBd-d
输入输出样例3
输入 输出
3 4 2
di-jkstra2-6
dijkstra2************6
数据规模和约定
  40%的数据满足:字符串长度不超过5
  100%的数据满足:1<=p1<=3,1<=p2<=8,1<=p3<=2。字符串长度不超过100
 
 /*
原则:
先排除不用填充的情况;
在由p1,p2求出要填充的字符串(也可以放在数组中);
再由p3来判断是否需要倒置填充.
*/
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define maxmap 10000
int p1,p2,p3;
int index;//表索引
int lenz=;//存放填充字符串的长度
char str[maxmap],result[maxmap];
int main(){
scanf("%d%d%d",&p1,&p2,&p3);
scanf("%s",&str);//录入字符串
int len = strlen(str);//获取字符串长度
for(int i=;i<len;i++){
/*
不需要填充的情况 :
-在首尾,不用填充;
-前后分别为数字和字母,不用填充;
-前后是连续的,不用填充.
*/
if(str[i] != '-' || !((str[i-]>='' && str[i+]<='') || (str[i-]>='a' && str[i+]<='z'))){
result[index++]=str[i];
}
/*-前后差值大于25,说明分别为字母和数字,不需要填充*/
else if(str[i+]-str[i-]>){
result[index++]=str[i];
}
else if(str[i+]-str[i-]<=){
result[index++]=str[i];
}
else{
if(str[i-]<=str[i]){//原字符不是正序也不需要填充的情况
result[index++] = str[i];
}
else {//原字符是正序则需要填充
char insert;//表示填充的字符
if(p1== && str[i-]>='a' && str[i-]<='z'){//p1=2,填充大写
insert = str[i-] - ('a'-'A')+;
}else{//否则按顺序填充就行
insert = str[i-]+;
}
if(p1==){//p1=3,填充 *
insert = '*';
}
lenz = str[i+]-str[i-];//获得填充字符串的长度
if(insert == '*'){//若填充字符为*
for(int k=;k<lenz;k++){
for(int j=;j<p2;j++){//填充p2个字符
result[index++] = insert;
}
}
}else{
if(p3==){//逆序填充
insert+=lenz-;
for(int k=;k<lenz;k++,insert--){
for(int j=;j<p2;j++){
result[index++] = insert;
}
}
}
if(p3==){//原序填充
for(int k=;k<lenz;k++,insert++){
for(int j=;j<p2;j++){
result[index++] = insert;
}
}
}
}
}
}
}
printf("%s",result);
return ;
}

C语言 · 字符串的展开的更多相关文章

  1. Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)

    ** 算法训练 字符串的展开 ** 题目: 在初赛普及组的"阅读程序写结果"的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于"d-h" ...

  2. C语言字符串操作总结大全(超详细)

    本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作  strcpy(p, p1) 复制字符串  strncpy(p, p1, n) 复制指定长度字符串  strcat( ...

  3. C语言字符串拷贝

    C语言字符串拷贝利用指针操作,要清楚知道指针的指向 代码如下: #include <stdio.h> #include <assert.h> #include <stri ...

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

    35:字符串的展开 总时间限制:  1000ms 内存限制:  65536kB 描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h ...

  5. C语言字符串长度(转)

    C语言字符串长度的计算是编程时常用到的,也是求职时必考的一项. C语言本身不限制字符串的长度,因而程序必须扫描完整个字符串后才能确定字符串的长度. 在程序里,一般会用strlen()函数或sizeof ...

  6. C语言字符串操作常用库函数

    C语言字符串操作常用库函数 *********************************************************************************** 函数 ...

  7. c语言字符串操作大全

     C语言字符串操作函数 函数名: strcpy 功  能: 拷贝一个字符串到另一个 用  法: char *stpcpy(char *destin, char *source); 程序例: #incl ...

  8. TYVJ P1053 字符串的展开 Label:字符 水

    背景 NOIP2007年提高组第2道 描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或“4-8”的子串,我们就把它当作一种简 ...

  9. 转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

    转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 C++常用库函数atoi,itoa,strcpy,strcmp的实现 作者:jcsu C语言字符串操作函数 1. ...

随机推荐

  1. java基础知识总结(二)

    +=隐含了强制类型转换. x+=y;等价与:x = (x的数据类型)(x + y); 函数重载? 函数名同样.參数列表不同.跟返回值不关,就是函数重载 封装是什么? 隐藏对象的属性和详细的实现细节,仅 ...

  2. javascript刷新页面代码

    原文链接:http://caibaojian.com/javascript-refresh-page.html reload 方法,该方法强迫浏览器刷新当前页面. 语法:location.reload ...

  3. android Jni NDK开发环境搭建及其简单实例的编写

    android  Jni  NDK开发环境搭建及其简单实例的编写 由于工作需要,需要采用开发想要的JNI,由于之前没有接触过安卓的开发,所以更加网上的帖子,学习了下.遇到了些问题,然后总结下学习过程中 ...

  4. Android调用系统软键盘

    /** * * @MethodName:closeInputMethod * @Description:关闭系统软键盘 * @throws */ public void closeInputMetho ...

  5. JPA的多表复杂查询

    转 JPA的多表复杂查询:详细篇 原文链接: https://mp.weixin.qq.com/s/7J6ANppuiZJccIVN-h0T3Q 2017-11-10 从小爱喝AD钙  最近工作中由于 ...

  6. unity, 2d rope

    https://www.youtube.com/watch?v=l6awvCT29yU

  7. MySql(十七):MySql架构设计——高可用设计之思路及方案

    前言: 数据库系统是一个应用系统的核心部分,要想系统整体可用性得到保证,数据库系统就不能出现任何问题.对于一个企业级的系统来说,数据库系统的可用性尤为重要.数据库系统一旦出现问题无法提供服务,所有系统 ...

  8. iOS安全攻防(十八):数据保护API

    数据保护API 题外话 开篇先扯几句题外话,许多朋友都问我怎么不写防啊,我确实有点犹豫.hackers总是想象如果自己是开发者会怎么写,然后才能找到入手点.同理,开发者们也要想象自己是hackers会 ...

  9. [na]完全理解icmp协议

    1.ICMP出现的原因 在IP通信中,经常有数据包到达不了对方的情况.原因是,在通信途中的某处的一个路由器由于不能处理所有的数据包,就将数据包一个一个丢弃了.或者,虽然到达了对方,但是由于搞错了端口号 ...

  10. spark repartition

    https://jaceklaskowski.gitbooks.io/mastering-apache-spark/content/spark-rdd-partitions.html http://s ...