링크를 클릭 전체 솔루션 요약 PAT B - AC
제목 :
텍스트 압축 여기에 여러 가지 방법이 있습니다 우리는 가장 간단한 종류를 고려 : 같은 문자와 문자를 포함하는이 단편의 문자 번호로 개별 세그먼트를 대표했다. 예를 들어, ccccc
사용하는 5c
표현하기. 문자가 반복되지 않는 경우가 출력됩니다. 예를 들어, aba
그것은 압축 계속 aba
.
복원 방법은 차례로, 이러한 표현을 복원하는 (c) 모양이다 ccccc
.
귀하의 요청이 처리를위한 주어진 문자열에 대한 압축과 압축 해제의 필요성. 여기에서 우리는 단순히 원래 문자열이 완전히 영어 문자와 공간의 비어 있지 않은 문자열이 있다고 가정합니다.
입력 형식 :
주어진 문자의 제 1 라인의 입력이있는 경우 C
는 다음 수단 문자열은 압축되고, 만약 D
그 다음 문자열이 압축 해제 될 것을 의미한다. 두 번째 줄 필요가 없습니다주는 끝에 캐리지 리턴으로, 압축 또는 1000 개 문자의 문자열을 압축 해제한다. 제목에 반복되는 문자의 수는 정수 범위, 출력 파일이 1MB 미만이되지 않도록.
출력 형식 :
요청 문자열 압축 또는 감압하고, 출력 라인의 결과.
샘플 입력 1 :
C
TTTTThhiiiis isssss a tesssst CAaaa as
출력 샘플 1 :
5T2h4is i5s a3 te4st CA3a as
샘플 입력 2 :
D
5T2h4is i5s a3 te4st CA3a as10Z
출력 샘플 2 :
TTTTThhiiiis isssss a tesssst CAaaa asZZZZZZZZZZ
내 코드 :
#include<iostream>
#include<cstdio>
#include<vector>
#include<string>
#include<set>
#include<map>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<cstring>
#include<sstream>
using namespace std;
//有的时候题目是一起做的,所以会有不需要的头文件
int main()
{
char c;
scanf("%c",&c);
getchar();//如果是scanf("%c\n",&c)case3会报错
string src;
getline(cin,src);
if(c=='C')//压缩
{
for(int i=0;i<src.size();i++)
{
if(src[i]==src[i+1])
{
int j=i+1;
while(j<src.length()&&src[j]==src[i])j++;
int num=j-i;
string temp=to_string(num);
temp+=src[i];
src.replace(i,j-i,temp);//所有相同字母替换
}
}
}
else //解压
{
if(src.length()==0)cout<<" ";//case 2
else
for(int i=0;i<src.size();i++)//解压的时候遍历完整
{
if(src[i]>='0'&&src[i]<='9')
{
int j=i+1;
while(j<src.length()&&src[j]>='0'&&src[j]<='9')j++;
int num=stoi(src.substr(i,j-i));
string temp;
while(num-->0)temp+=src[j];
src.replace(i,j-i+1,temp);//数字和后一个字母替换
}
}
}
cout<<src;
return 0;
}
참고 : scanf와 ( "% (C)가 \ n", & C) case3이 주어지고, 나는 이유를 알 수없는 경우, 당신은 getchar가 ()를 사용한다;
주 : 상기 케이스의 압축 해제 공간 출력 케이스 (2);