読者です 読者をやめる 読者になる 読者になる

AOJ2684 RLE Replacement

問題
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2684

ランレングス符号化された文字列A, B, Cが与えられる。
Aのうち、はじめてBが生じる場所をCに置換せよ。

A, B, Cの各文字と数字のペアの数 <= 1000


解法
符号化された状態でO(N^2)で置換処理を行う。

Bのペアの数 > 1 について、
Bの先頭と末尾が、Aの該当箇所の数以下であり、かつBの間がAの該当箇所の数と一致していればCに置換できる。
置換したAの該当箇所の先頭と末尾については数を減らして、そのとき数が0となったら削除するようにする。

Bのペアの数 = 1 について、
Aの該当箇所について左から置換する必要があるので、Aの該当箇所の数を減らして、その右に置換後のCを連結する。Aの該当箇所の数が0であれば削除しておく。

void change(deque<pair<char, int>>& nv0) {
  if(nv0.size() > 1 && nv0[nv0.size()-2].first == nv0.back().first) {
    int k = nv0.back().second;
    nv0.pop_back();
    nv0.back().second += k;
  }
}
 
void output(deque<pair<char, int>>& out) {
  rep(i, out.size()) {
    if(i) cout << " ";
    cout << out[i].first << " " << out[i].second;
  }
  cout << " $" << endl;
}
 
int main() {
 
  vector<deque<pair<char, int>>> v(3);
  for(auto& u: v) {
    while(1) {
      char c; cin >> c;
      if(c == '$') break;
      int n; cin >> n;
      u.emplace_back(c, n);
    }
  }
 
  rep(i, (int)v[0].size()-(int)v[1].size()+1) {
 
    if(v[1].size() == 1) {
      const int a = v[0][i].second, b = v[1][0].second;
      if(v[0][i].first == v[1][0].first && a >= b) {
        deque<pair<char, int>> nv0;
        rep(k, i) {
          nv0.push_back(v[0][k]);
        }
 
        rep(k, v[2].size()) {
          nv0.push_back(v[2][k]);
          change(nv0);
        }
 
        if(a - b > 0) {
          nv0.push_back(v[0][i]);
          nv0.back().second = a - b;
          change(nv0);
        }
        REP(k, i+1, v[0].size()) {
          nv0.push_back(v[0][k]);
          change(nv0);
        }
        v[0] = nv0;
        break;
      } else {
        continue;
      }
 
    }
 
    int j = 0;
    vector<int> V;
    while(j < v[1].size() && v[0][i+j].first == v[1][j].first) {
      if(j == 0 || j == (int)v[1].size()-1) {
        if(v[0][i+j].second < v[1][j].second) break;
        V.push_back(v[0][i+j].second - v[1][j].second);
      }
      else {
        if(v[0][i+j].second != v[1][j].second) break;
      }
      j++;
    }
 
    deque<pair<char, int>> nv0;
 
    if(j == v[1].size()) {
      rep(k, v[0].size()) {
        if(k < i) {
          nv0.push_back(v[0][k]);
          change(nv0);
        }
        if(k == i) {
          if(V[0] > 0) nv0.emplace_back(v[0][i].first, V[0]);
          rep(l, v[2].size()) {
            nv0.push_back(v[2][l]);
            change(nv0);
          }
          k = i+v[1].size()-1;
        }
        if(k == i+j-1) {
          if(V[1] > 0) nv0.emplace_back(v[0][i+j-1].first, V[1]);
          change(nv0);
        }
        if(i+j <= k) {
          nv0.push_back(v[0][k]);
          change(nv0);
        }
      }
      v[0] = nv0;
      break;
    }
  }
 
  output(v[0]);
 
  return 0;
}