UVa 245 : Uncompress
UVa演習 : 2014/6/16 (月) 問1
問題リンク : http://uva.onlinejudge.org/external/2/245.html
問題概要:
暗号化されたテキストが与えられるので復号せよ
解法:
書いてある通りに実装する
コード:
#include<bits/stdc++.h> #define REP(i,s,n) for(int i=s;i<n;i++) #define rep(i,n) REP(i,0,n) using namespace std; int main(){ /* string s = "They say he carved it himself...from a BIGGER spoon"; string s2 = "*****"; s.replace( 32, s2.length(), s2 ); cout << s << endl; */ vector<string> buf; string tmp; while( getline(cin,tmp) ){ if( tmp == "0" ) break; buf.push_back(tmp); } vector<string> nbuf = buf; rep(i,buf.size()) nbuf[i] += " "; deque<string> deq; set<string> S; int prev,pos; rep(i,nbuf.size()){ prev = 0; rep(j,nbuf[i].size()){ if( !( isalpha(nbuf[i][j]) || isdigit(nbuf[i][j]) ) ) { if( isalpha(nbuf[i][prev]) ) { tmp = nbuf[i].substr(prev,j-prev); cout << tmp; if( S.count(tmp) ) { pos = 0; Next:; deq.erase(deq.begin()+pos); deq.push_front(tmp); } else deq.push_front(tmp); } else if( isdigit(nbuf[i][prev]) ) { tmp = nbuf[i].substr(prev,j-prev); pos = (atoi)(tmp.c_str()); --pos; cout << deq[pos]; tmp = deq[pos]; goto Next; } if( j == (int)nbuf[i].size()-1 ) puts(""); else printf("%c",nbuf[i][j]); prev = j + 1; } } } return 0; }