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

35:字符串的展开

总时间限制: 
1000ms

内存限制: 
65536kB
描述

在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“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行为一行字符串,仅由数字、小写字母和减号“-”组成。行首和行末均无空格。

40%的数据满足:字符串长度不超过5;
100%的数据满足:1<=p1<=3,1<=p2<=8,1<=p3<=2。字符串长度不超过100。

输出
只有一行,为展开后的字符串。
样例输入
样例 #1:
1 2 1
abcs-w1234-9s-4zz

样例 #2:
2 3 2
a-d-d

样例 #3:
3 4 2
di-jkstra2-6
样例输出
样例 #1:
abcsttuuvvw1234556677889s-4zz

样例 #2:
aCCCBBBd-d

样例 #3:
dijkstra2************6
来源
NOIP2007复赛 提高组 第二题
思路:
  来自xxy
来,上代码:

#include<cstring>
#include<iostream>
#include<algorithm> 

using namespace std;

int p1,p2,p3,len,sum;

char a[30000],b[30000];

int main()
{
    cin>>p1>>p2>>p3>>a;
    len=strlen(a);
    for(int i=0;i<len;i++)
    if(a[i]==‘-‘&&i&&i<=strlen(a)-2)
    {
        if(a[i-1]==‘-‘||a[i+1]==‘-‘) cout<<‘-‘;
        else if(a[i+1]==a[i-1]+1) continue;
        else if(a[i-1]>=a[i+1]||(a[i-1]<=‘9‘&&a[i+1]>=‘A‘)) cout<<‘-‘;
        else
        {
            int l=0;
            if(p1==1)
            {
                for(int j=a[i-1]+1;j<a[i+1];j++)
                {
                    for(int k=1;k<=p2;k++)
                        b[l++]=tolower((char)j);
                }
            }
               else if(p1==2)
               {
                  for(int j=a[i-1]+1;j<a[i+1];j++)
                {
                    for(int k=1;k<=p2;k++)
                    b[l++]=toupper((char)j);
                }
            }
            else
            {
                   for(int j=a[i-1]+1;j<a[i+1];j++)
                {
                       for(int k=1;k<=p2;k++) b[l++]=‘*‘;
                }
            }
            if(p3==2)
            reverse(b,b+l);
            for(int j=0;j<l;j++) cout<<b[j];
        }
    }
    else cout<<a[i];
}

时间: 2024-10-10 12:48:39

AC日记——字符串的展开 openjudge 1.7 35的相关文章

AC日记——字符串判等 openjudge 1.7 17

17:字符串判等 总时间限制:  1000ms 内存限制:   65536kB 描述 判断两个由大小写字母和空格组成的字符串在忽略大小写,且忽略空格后是否相等. 输入 两行,每行包含一个字符串. 输出 若两个字符串相等,输出YES,否则输出NO. 样例输入 a A bb BB ccc CCC Aa BBbb CCCccc 样例输出 YES 思路: 大模拟: 来,上代码: #include<cstdio> #include<string> #include<cstring>

AC日记——字符串最大跨距 openjudge 1.7 26

26:字符串最大跨距 总时间限制:  1000ms 内存限制:  65536kB 描述 有三个字符串S,S1,S2,其中,S长度不超过300,S1和S2的长度不超过10.想检测S1和S2是否同时在S中出现,且S1位于S2的左边,并在S中互不交叉(即,S1的右边界点在S2的左边界点的左侧).计算满足上述条件的最大跨距(即,最大间隔距离:最右边的S2的起始点与最左边的S1的终止点之间的字符数目).如果没有满足条件的S1,S2存在,则输出-1. 例如,S = "abcd123ab888efghij45

AC日记——字符串P型编码 openjudge 1.7 31

31:字符串p型编码 总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个完全由数字字符('0','1','2',…,'9')构成的字符串str,请写出str的p型编码串.例如:字符串122344111可被描述为"1个1.2个2.1个3.2个4.3个1",因此我们说122344111的p型编码串为1122132431:类似的道理,编码串101可以用来描述1111111111:00000000000可描述为"11个0",因此它的p型编码串即为11

AC日记——验证字串 openjudge 1.7 18

18:验证子串 总时间限制:  1000ms 内存限制:   65536kB 描述 输入两个字符串,验证其中一个串是否为另一个串的子串. 输入 输入两个字符串, 每个字符串占一行,长度不超过200且不含空格. 输出 若第一个串s1是第二个串s2的子串,则输出(s1) is substring of (s2) 否则,若第二个串s2是第一个串s1的子串,输出(s2) is substring of (s1) 否则,输出 No substring. 样例输入 abc dddncabca 样例输出 ab

AC日记——回文子串 openjudge 1.7 34

34:回文子串 总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个字符串,输出所有长度至少为2的回文子串. 回文子串即从左往右输出和从右往左输出结果是一样的字符串,比如:abba,cccdeedccc都是回文字符串. 输入 一个字符串,由字母或数字组成.长度500以内. 输出 输出所有的回文子串,每个子串一行.子串长度小的优先输出,若长度相等,则出现位置靠左的优先输出. 样例输入 123321125775165561 样例输出 33 11 77 55 2332 2112

AC日记——逆波兰表达式 openjudge 3.3 1696

1696:逆波兰表达式 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入 输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数. 输出 输出为一行,表达式的值.可直接用pr

AC日记——配对碱基链 openjudge 1.7 07

07:配对碱基链 总时间限制:  1000ms 内存限制:  65536kB 描述 脱氧核糖核酸(DNA)由两条互补的碱基链以双螺旋的方式结合而成.而构成DNA的碱基共有4种,分别为腺瞟呤(A).鸟嘌呤(G).胸腺嘧啶(T)和胞嘧啶(C).我们知道,在两条互补碱基链的对应位置上,腺瞟呤总是和胸腺嘧啶配对,鸟嘌呤总是和胞嘧啶配对.你的任务就是根据一条单链上的碱基序列,给出对应的互补链上的碱基序列. 输入 一个字符串,表示一条碱基链.这个字符串只含有大写字母A.T.G.C,分别表示腺瞟呤.胸腺嘧啶.

AC日记——合法C标识符 openjudge 1.7 06

06:合法 C 标识符 总时间限制:  1000ms 内存限制:   65536kB 描述 给定一个不包含空白符的字符串,请判断是否是C语言合法的标识符号(注:题目保证这些字符串一定不是C语言的保留字). C语言标识符要求: 1. 非保留字: 2. 只包含字母.数字及下划线(“_”). 3. 不以数字开头. 输入 一行,包含一个字符串,字符串中不包含任何空白字符,且长度不大于20. 输出 一行,如果它是C语言的合法标识符,则输出yes,否则输出no. 样例输入 RKPEGX9R;TWyYcp 样

AC日记——统计单词数 openjudge 1.12 5

05:统计单词数 总时间限制:  1000ms 内存限制:  65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置.注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样