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

2022-05-06 05:54:07 字數 3252 閱讀 5298

在初賽普及組的「閱讀程式寫結果」的問題中,我們曾給出乙個字串展開的例子:如果在輸入的字串中,含有類似於「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」。

輸入格式:

輸入檔案expand.in包括兩行:

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

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

輸出格式:

輸出檔案expand.out只有一行,為展開後的字串。

輸入樣例#1:

【輸入樣例1】

1 2 1

abcs-w1234-9s-4zz

【輸入樣例2】

2 3 2

a-d-d

輸出樣例#1:

【輸出樣例1】

abcsttuuvvw1234556677889s-4zz

【輸出樣例2】

acccbbbd-d

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

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

noip 2007 提高第二題

模擬+字串

又是一道純模擬題。根據題意將合法的「-」展開,注意字元-數字、數字-字元、字元大小寫"-"前後相同以及「-」開頭的情況。

題目比較繁瑣,更多的特殊情況以及細節問題我就不再多說(具體參見**)。

值得一提的是筆者在字串操作中用到了與ascii碼有關的的ord和chr函式,這在字串操作問題上是非常有效的(剩下的靠毅力吧)。

下面附上**。

program expand;  

var  

p1,p2,p3,l,i,j,k:longint;  

s:string;  

a:array[1..100] of longint;  

begin  

readln(p1,p2,p3);  

readln(s);  

l:=length(s);  

for i:=1 to l do  

a[i]:=ord(s[i]);  

write(s[1]);  

for i:=2 to l-1 do  

if a[i]=45 then  

begin  

if (a[i-1]=a[i]) or (a[i]=a[i+1]) then  

begin  

write(s[i]);  

continue;  

end;  

if a[i-1]+1=a[i+1] then continue;  

if (a[i-1]+11]) and ((961]) or (a[i+1]<58)) then  

begin  

if (p1=1) and (a[i-1]>96) then  

begin  

if p3=1 then  

for j:=a[i-1]+1 to a[i+1]-1 do  

for k:=1 to p2 do  

write(chr(j));  

if p3=2 then  

for j:=a[i+1]-1 downto a[i-1]+1 do  

for k:=1 to p2 do  

write(chr(j));  

end;  

if (p1=2) and (a[i-1]>96) then  

begin  

if p3=1 then  

for j:=a[i-1]+1 to a[i+1]-1 do  

for k:=1 to p2 do  

write(chr(j-32));  

if p3=2 then  

for j:=a[i+1]-1 downto a[i-1]+1 do  

for k:=1 to p2 do  

write(chr(j-32));  

end;  

if ((p1=1) or (p1=2)) and (a[i-1]<96) then  

begin  

if p3=1 then  

for j:=a[i-1]+1 to a[i+1]-1 do  

for k:=1 to p2 do  

write(chr(j));  

if p3=2 then  

for j:=a[i+1]-1 downto a[i-1]+1 do  

for k:=1 to p2 do  

write(chr(j));  

end;  

if p1=3 then  

for j:=a[i+1]-1 downto a[i-1]+1 do  

for k:=1 to p2 do  

write('*');  

end  

else write(s[i]);  

end  

else write(s[i]);  

write(s[l]);  

end. 

洛谷1098 字串的展開

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

洛谷1098 字串的展開(2528 1064)

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

洛谷 模擬 字串 1098 字串的展開

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