07noip 字串的展開 解題報告

2021-06-28 15:47:40 字數 3174 閱讀 9073

題目描述 

description

【問題描述】

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

入的字串中,含有類似於「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」。

輸入描述 

input description

第 1 行為用空格隔開的3 個正整數,依次表示引數p1,p2,p3。

第 2 行為一行字串,僅由數字、小寫字母和減號「-」組成。行首和行末均無空格。

輸出描述 

output description

輸出只有一行,為展開後的字串。

樣例輸入 

sample input

【輸入輸出樣例1】

1 2 1

abcs-w1234-9s-4zz

【輸入輸出樣例2】

2 3 2

a-d-d

【輸入輸出樣例3】

3 4 2

di-jkstra2-6

樣例輸出 

sample output

【輸入輸出樣例1】

abcsttuuvvw1234556677889s-4zz

【輸入輸出樣例2】

acccbbbd-d

【輸入輸出樣例3】

dijkstra2************6

資料範圍及提示 

data size & hint

【限制】

40%的資料滿足:字串長度不超過5

100%的資料滿足:1<=p1<=3, 1<=p2<=8, 1<=p3<=2。字串長度不超過100

這個題目並不難,只是有點麻煩而已,根據題意模擬著做就好了,但必須注意,有些時候『-』會出現在句前或者句末。

**風格略渣,不喜勿噴。

1

program

p1053;

2var

3p1,p2,p3:longint;

4ans,b:ansistring;

5s:string;

6c:char;

7i,ll,j,l,t:longint;

8function

pd(s,t:char):boolean;

9begin

10 pd:=false;

11if ((ord(s)>47) and (ord(s)<58)) and ((ord(t)>47)and(ord(t)<58)) or ((ord(s)>96) and (ord(s)<123)) and ((ord(t)>96)and(ord(t)<123

))12

then exit(true); //判斷語句實在是長

13end;14

begin

15readln(p1,p2,p3);

16readln(s);

17 ans:=s[1

];18 l:=length(s);

19for i:= 2

to l-1

do //處理

20if s[i]='-'

then

21begin

22if ((ord(s[i-1])>=ord(s[i+1])))or

not (pd(s[i-1],s[i+1

]))23

then ans:=ans+'-'

24else

if ord(s[i+1])-ord(s[i-1])>1

then

25begin

26 b:='';27

if p3=1

then

28for c:= succ(s[i-1]) to pred(s[i+1]) do

29for t:=1

to p2 do

30 b:=b+c;

31if p3=2

then

32for c:= pred(s[i+1]) downto succ(s[i-1]) do

33for t:= 1

to p2 do

34 b:=b+c;

35 ll:=length(b);

36if p1=2

then

for j:= 1

to ll do

37if (ord(b[j])>=97) then b[j]:=chr(ord(b[j])-32

);38

if p1=3

then

for j:= 1

to ll do b[j]:='*'

;39 ans:=ans+b;

40end;41

end42

else ans:=ans+s[i];

43 ans:=ans+s[l];

44writeln(ans);

45end.

洛谷1098 字串的展開 解題報告

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

解題報告 Noip2007字串的展開

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

字串的展開

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