土下座しながら探索中

主に競技プログラミング

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;
}