1. 程式人生 > >[NOIP2007提高組]字串的展開

[NOIP2007提高組]字串的展開

題目描述

在初賽普及組的“閱讀程式寫結果”的問題中,我們曾給出一個字串展開的例子:如果在輸入的字串中,含有類似於“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 2 1
abcs-w1234-9s-4zz

輸出樣例#1: 複製
abcsttuuvvw1234556677889s-4zz

輸入樣例#2: 複製
2 3 2
a-d-d
輸出樣例#2: 複製
aCCCBBBd-d

說明

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

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

NOIP 2007 提高第二題


【程式碼】

#include<string>
#include<iostream>
#include<map>
using namespace std;
string s;
map<char,char>key;
int main() {
	int p1,p2,p3;
	cin>>p1>>p2>>p3;
	cin>>s;
	if(p1==2)for(int i=0; i<26; i++)key['A'+i]=key['a'+i]='A'+i;
	if(p1==1)for(int i=0; i<26; i++)key['A'+i]=key['a'+i]='a'+i;
	if(p1==3)for(int i=0; i<26; i++)key['A'+i]=key['a'+i]='*';
	for(int i='0'; i<='9'; i++)key[i]=i;
	if(p1==3)for(int i='0'; i<='9'; i++)key[i]='*';
	for(int i=0; i<s.length(); i++)if(s[i]=='-') {
			if(s[i-1]+1==s[i+1]) {
				s=s.substr(0,i)+s.substr(i+1,s.length()-i-1);
				continue;
			}
			if(s[i+1]>s[i-1]&&(s[i+1]>='a'&&s[i-1]>='a'&&s[i+1]<='z'&&s[i-1]<='z'||s[i+1]>='0'&&s[i-1]>='0'&&s[i+1]<='9'&&s[i-1]<='9'))
				if(p3==1) {
					string b=s.substr(0,i);
					for(char ch=s[i-1]+1; ch<s[i+1]; ch++)
						for(int i=1; i<=p2; i++)b+=key[ch];
					b=b+s.substr(i+1,s.length()-1-i);
					s=b;
				} else {
					string b=s.substr(0,i);
					for(char ch=s[i+1]-1; ch>s[i-1]; ch--)
						for(int i=1; i<=p2; i++)b+=key[ch];
					b=b+s.substr(i+1,s.length()-i-1);
					s=b;
				}
		}
	cout<<s;
}