1. 程式人生 > >重慶賽區ACM熱身賽-8528. 壓縮和解壓縮

重慶賽區ACM熱身賽-8528. 壓縮和解壓縮

8528. 壓縮和解壓縮

 

【問題描述】

prime21有一種用於壓縮僅有小寫字元的串的方式,壓縮方式如下:
記原串為S,原串中連續相同的x個字元(x≥2),在新串中用cx表示(c表示該相同的字元),其餘字元不變。
例子如下
原串                      新串
prime                    prime
wjj                        wj2
kkkkkkkkkkdao       k10dao

現在要求你完成以下兩種任務:
1.給定一個原串,輸出壓縮後的新串
2.給定一個新串,輸出壓縮前的原串

【輸入形式】

第一行,一個整數(1 or 2),表示任務的型別
第二行,表示該任務所提供的串

【輸出形式】

一行,表示按要求應當輸出的串

【樣例輸入1】
1
pppppppr

【樣例輸出1】
p7r

 

【樣例輸入2】
2
wj2

【樣例輸出2】
wjj
 

【樣例說明】


【評分標準】

全文比較忽略行末空格和結尾空行

【資料範圍】
保證任務中原串的長度小於10000
保證壓縮後的串格式合法

 

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
char a[10000+10];
int b[10000+10];
int main(){
	int m;
	cin>>m;
	scanf("%s",a);
	if(m==1){
		for(int i=0;i<strlen(a)-1;i++){
			if(a[i]!=a[i+1]){
				printf("%c",a[i]);
			}else{
				int tot=0;
				while(a[i]==a[i+1]){
					tot++;
					i++;
				}
				tot+=1;
				printf("%c%d",a[i],tot);
			}
			if(i==strlen(a)-2)
				printf("%c",a[i+1]);
		} 
		
	}else{
		long long sum=0;
		int p=0;
		char tc;
		for(int i=0;i<strlen(a);){
			if(a[i]>=97&&a[i]<=122){	//字母 
				printf("%c",a[i]);
				tc=a[i];
				i++;
			}
			else{		//數字 
				while(a[i]>=48&&a[i]<=57)
					b[p++]=a[i++]-'0';
					int o=0;
					while(--p>=0){
						sum+=b[p]*pow(10,o);
						o++;
					}
					for(int i=0;i<sum-1;i++){
						printf("%c",tc);
					}
//除錯					cout<<"\t"<<sum<<endl;
					p=0;
					sum=0; 
			}
		}
	}
	return 0;
} 

水題啊!