题目描述

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

(1) 遇到下面的情况需要做字符串的展开:在输入的字符串中,出现了减号“-”,减号两侧同为小写字母或同为数字,且按照ASCII码的顺序,减号右边的字符严格大于左边的字符。

(2) 参数p1p_1p1​:展开方式。p1=1p_1=1p1​=1时,对于字母子串,填充小写字母;p1=2p_1=2p1​=2时,对于字母子串,填充大写字母。这两种情况下数字子串的填充方式相同。p1=3p_1=3p1​=3时,不论是字母子串还是数字字串,都用与要填充的字母个数相同的星号“*”来填充。

(3) 参数p2p_2p2​:填充字符的重复个数。p2=kp_2=kp2​=k表示同一个字符要连续填充k个。例如,当p2=3p_2=3p2​=3时,子串“d-h”应扩展为“deeefffgggh”。减号两边的字符不变。

(4) 参数p3p_3p3​:是否改为逆序:p3=1p3=1p3=1表示维持原来顺序,p3=2p_3=2p3​=2表示采用逆序输出,注意这时候仍然不包括减号两端的字符。例如当p1=1p_1=1p1​=1、p2=2p_2=2p2​=2、p3=2p_3=2p3​=2时,子串“d-h”应扩展为“dggffeeh”。

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

输入输出格式

输入格式:

共两行。

第111行为用空格隔开的333个正整数,依次表示参数p1,p2,p3p_1,p_2,p_3p1​,p2​,p3​。

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

输出格式:

共一行,为展开后的字符串。

输入输出样例

输入样例#1:
复制

1 2 1
abcs-w1234-9s-4zz
输出样例#1: 复制

abcsttuuvvw1234556677889s-4zz
输入样例#2: 复制

2 3 2
a-d-d
输出样例#2: 复制

aCCCBBBd-d

说明

40%40\%40%的数据满足:字符串长度不超过555

100%100\%100%的数据满足:1≤p1≤3,1≤p2≤8,1≤p3≤21 \le p_1 \le 3,1 \le p_2 \le 8,1 \le p_3 \le 21≤p1​≤3,1≤p2​≤8,1≤p3​≤2。字符串长度不超过100100100

NOIP 2007 提高第二题


这题模拟还是略恶心。


#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
#define reg register
int p1, p2, p3;
char str[], ans[];
bool tian[];
int cnt; inline bool isnum(int x)
{
if (x >= 'a' and x <= 'z') return ;
if (x >= 'A' and x <= 'Z') return ;
return ;
} int main()
{
scanf("%d%d%d", &p1, &p2, &p3);
scanf("%s", str + );
int n = strlen(str + );
for (reg int i = ; i <= n ; i ++)
{
if (str[i] != '-') {ans[++cnt] = str[i];continue;}
if (i == or i == n) {ans[++cnt] = str[i];continue;}
if (str[i-] == '-' or str[i+] == '-') {ans[++cnt] = str[i];continue;}
int pre = str[i-], nxt = str[i+];
if (pre + == nxt) {continue;}
if (pre >= nxt) {ans[++cnt] = '-';continue;}
if ((isnum(pre) and isdigit(nxt)) or (isnum(nxt) and isdigit(pre))) {ans[++cnt] = '-';continue;}
if (p3 == ) {
for (reg int j = pre + ; j <= nxt - ; j ++)
for (reg int k = ; k <= p2 ; k ++)
ans[++cnt] = j, tian[cnt] = ;
} else {
for (reg int j = nxt - ; j >= pre + ; j --)
for (reg int k = ; k <= p2 ; k ++)
ans[++cnt] = j, tian[cnt] = ;
}
}
for (reg int i = ; i <= cnt ; i ++)
{
if (p1 == ) {
if (!tian[i]) printf("%c", ans[i]);
else printf("*");
}
else if (p1 == ) {
if (!tian[i] or (ans[i] >= '' and ans[i] <= '') or (ans[i] >= 'A' and ans[i] <= 'Z')) printf("%c", ans[i]);
else printf("%c", ans[i] - 'a' + 'A');
} else {
if (!tian[i] or (ans[i] >= '' and ans[i] <= '') or (ans[i] >= 'a' and ans[i] <= 'z')) printf("%c", ans[i]);
else printf("%c", ans[i] + 'a' - 'A');
}
}
return ;
}

[Noip2007] 字符串的展开的更多相关文章

  1. cogs 48. [NOIP2007] 字符串的展开

    48. [NOIP2007] 字符串的展开 ★☆   输入文件:expand.in   输出文件:expand.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 在初赛普 ...

  2. NOIP2007 字符串展开

    .字符串的展开 (expand.pas/c/cpp) [问题描述] 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或“4-8”的子 ...

  3. [NOIP2007] 提高组 洛谷P1098 字符串的展开

    题目描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母获数 ...

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

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

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

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

  6. Luogu 1098 - 字符串的展开 - [字符串操作][模拟]

    题目链接:https://www.luogu.org/problemnew/show/P1098 题目描述在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中 ...

  7. 洛谷P1098 字符串的展开【字符串】【模拟】

    题目描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母或数 ...

  8. C语言 · 字符串的展开

     算法训练 字符串的展开   时间限制:1.0s   内存限制:256.0MB      在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d ...

  9. noip200706字符串的展开

    试题描述: 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母获 ...

随机推荐

  1. 三、SpringBoot 整合mybatis 多数据源以及分库分表

    前言 说实话,这章本来不打算讲的,因为配置多数据源的网上有很多类似的教程.但是最近因为项目要用到分库分表,所以让我研究一下看怎么实现.我想着上一篇博客讲了多环境的配置,不同的环境调用不同的数据库,那接 ...

  2. (七十一)c#Winform自定义控件-折现图

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  3. [STL] Implement "vector", ”deque“ and "list"

    vector “可增的”数组 vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似. 不同的地方就是: (1) 数组是静态分配空间,一旦分配了空间的大小,就不可再改变了: (2) v ...

  4. 解决commBind: Cannot bind socket FD 18 to [::1]: (99) Cannot assign requested address squid

    最近玩squid主要是为了爬虫代理,但是使用docker搭建squid的时候发现,docker一直默认使用的 ipv6,但是squid使用ipv4,导致无法绑定,出现commBind: Cannot ...

  5. mysql创建表时字段类型选择与优化

    一.选择原则 1.应该尽量使用可以正确存储数据的最小字段类型 2.选用简单的数据类型,例如:一个是尽量用mysql内置的字段类型来存储日期和时间:另一个存储IP地址尽量用整型:能用整型的尽量不用字符串 ...

  6. CocosCreator实现动物同化

    获取源码 关注微信公众号『一枚小工 』,发送『动物同化 』获取完整游戏源码. 游戏玩法 游戏目标是将游戏区域的动物全部同化成同一种动物.游戏从左上角开始,从右边点击需要变成的目标动物头像,如果被同化动 ...

  7. Unity项目 - DeathtrapDungeon死亡地牢

    目录 游戏原型 项目演示 绘图资源 代码实现 注意事项 技术探讨 参考来源 游戏原型 死亡地牢是一款 2D-Roguelike 的地牢冒险游戏.手握利刃,斩杀怪物,在凶险的地牢内生存下去.但注意,敌人 ...

  8. .netCore+Vue 搭建的简捷开发框架 (4)--NetCore 基础

    书接上文:上一节中,我们已经实现Services 层.(https://www.cnblogs.com/xuzhencheng/p/11424751.html) 但是具体要如何将服务依赖注入进来呢?继 ...

  9. JAVA线程通信之生产者与消费者

    package cn.test.hf.test3; import java.util.concurrent.locks.Condition;import java.util.concurrent.lo ...

  10. 23种设计模式之原型模式(Prototype Pattern)

    原型模式 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象 分析: 孙悟空:根据自己的形状复制(克隆)出多个身外身 软件开发:通过复制一个原型对象得到多个与原型对象一模一样的新对象 ...