重慶賽區ACM熱身賽-8528. 壓縮和解壓縮
阿新 • • 發佈:2018-11-10
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; }
水題啊!