解題報告 Noip2007字串的展開

2021-08-09 13:39:54 字數 2860 閱讀 4969

在初賽普及組的「閱讀程式寫結果」的問題中,我們曾給出乙個字串展開的例子:如果在輸入的

字串中,含有類似於「d-h」或者「4-8」的字串,我們就把它當作一種簡寫,輸出時,用連續

遞增的字母獲數字串替代其中的減號,即,將上面兩個子串分別輸出為「defgh」和「45678」。在

本題中,我們通過增加一些引數的設定,使字串的展開更為靈活。具體約定如下:

遇到下面的情況需要做字串的展開:在輸入的字串中,出現了減號「-」,減號兩側同為小寫字母或同為數字,且按照ascii碼的順序,減號右邊的字元嚴格大於左邊的字元。

引數p1:展開方式。p1=1時,對於字母子串,填充小寫字母;p1=2時,對於字母子串,填充大寫字母。這兩種情況下數字子串的填充方式相同。p1=3時,不論是字母子串還是數字字串,都用與要填充的字母個數相同的星號「*」來填充。

引數p2:填充字元的重複個數。p2=k表示同乙個字元要連續填充k個。例如,當p2=3時,子串「d-h」應擴充套件為「deeefffgggh」。減號兩邊的字元不變。

引數p3:是否改為逆序:p3=1表示維持原來順序,p3=2表示採用逆序輸出,注意這時候仍然不包括減號兩端的字元。例如當p1=1、p2=2、p3=2時,子串「d-h」應擴充套件為「dggffeeh」。

如果減號右邊的字元恰好是左邊字元的後繼,只刪除中間的減號,例如:「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

樣例輸出1

abcsttuuvvw1234556677889s-4zz

1s這玩意兒需要細心和對拍(不會看教程)

這玩意兒。。。。(tm就是高階點的字串模擬)

but還是要小心(爆0就尬了)

這裡推一波cctype標頭檔案

以下為字元函式庫中常用的函式:

函式名稱 返回值

isalnum() 如果引數是字母數字,即字母或數字,該函式返回true

isalpha() 如果引數是字母,該函式返回真

isblank() 如果引數是空格或水平製表符,該函式返回true

iscntrl() 如果引數是控制字元,該函式返回true

isdigit() 如果引數是數字(0~9),該函式返回true

isgraph() 如果引數是除空格之外的列印字元,該函式返回true

islower() 如果引數是小寫字母,該函式返回true

isprint() 如果引數是列印字元(包括空格),該函式返回true

ispunct() 如果引數是標點符號,該函式返回true

isspace()

如果引數是標準空白字元,如空格、進紙、換行符、回車

、水平製表符或者垂直製表符,該函式返回true

isupper() 如果引數是大寫字母,該函式返回true

isxdigit() 如果引數是十六進製制的數字,即0~9、a~f、a~f,該函式返回true

tolower() 如果引數是大寫字元,則返回其小寫,否則返回該引數

toupper() 如果引數是小寫字母,則返回其大寫,否則返回該引數

常用的有:

tolower()——toupper()

isupper()——islower()

isalnum()——isalpha()

還有,如果不擔心時間的話,最好用string類(用char不但操作麻煩而且爆零可能性大),string的自帶函式還是很方便滴

string str; //定義字串str

str[place]; //訪問字串str的第place項(首項為0),也可修改這一項的值

str.erase( int first , int len ); //刪除字串str開始的前len項

str.insert( int place , const char* c ); //在str的的place的位置,插入字串c

str.size(); //求str的長度,也可用str.length()代替

string.find(《字元》,《起始位置》)找到字串中第一次出現該字元的位置,若沒有返回string::npos(or -1)

string.replace(《起始位置》,《替換原字串字元個數》,《新字串》)替換字串中的字元

string+=《字元》 向字串末尾新增字元(串)

#include

#include

#include

#include

#include

using

namespace

std;

inline

bool checked(char c1,char c2)

int main()//特判2,續掉減號給我gun粗

/*********************

極為正經的分割線

***********************/

if(p1==1)

else

if(p1==2)

else

if(p1==3)

stry.replace(tipp,1,ins);}}

cout

0;}

NOIP2007 字串展開

字串的展開在初賽普及組的 閱讀程式寫結果 的問題中,我們曾給出乙個字串展開的例子 如果在輸入的字串中,含有類似於 d h 或 4 8 的子串,我們就把它當作一種簡寫,輸出時,用連續遞增的字母或數字串替代其中的減號,即,將上面兩個子串分別輸出為 defgh 和 45678 在本題中,我們通過增加一些引...

NOIP2007解題報告

第一題 某次科研調查時得到了n個自然數,每個數均不超過1500000000 1.5 109 已知不相同的數不超過10000個,現在需要統計這些自然數各自出現的次數,並按照自然數從小到大的順序輸出統計結果。解題過程 直接sort快拍然後掃瞄一遍即可。第二題 在初賽普及組的 閱讀程式寫結果 的問題中,我...

noip2007 字串展開 (模擬)

1379字串的展開 accepted 標籤 模擬 noip提高組2007 在初賽普及組的 閱讀程式寫結果 的問題中,我們曾給出乙個字串展開的例子 如果在輸入的 字串中,含有類似於 d h 或者 4 8 的字串,我們就把它當作一種簡寫,輸出時,用連續 遞增的字母獲數字串替代其中的減號,即,將上面兩個子...