1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<string> v;
int dim1(bool transpose) {
    return transpose ? n : m;
}
int dim2(bool transpose) {
    return transpose ? m : n;
}
char& get(int w, int k, bool transpose = 0) {
    if(!(transpose ? (0<=w&&w<n&&0<=k&&k<=m) : (0<=w&&w<m&&0<=k&&k<=n))) throw w*100000+k;
    return transpose ? v[w][k] : v[k][w];
}
void gravity(bool transpose, bool nakoniec) {
    string t;
    for(int i = 0; i < dim1(transpose); ++i) {
        t.clear();
        for(int j = 0; j < dim2(transpose); ++j) {
            char tt = get(i, j, transpose);
            if(tt != '.') t += tt;
        }
        int l = nakoniec ? dim2(transpose) - t.size() : 0;
        int r = nakoniec ? dim2(transpose) : t.size();
        for(int k = 0; k < l; ++k) get(i, k, transpose) = '.';
        for(int k = 0; k < t.size(); ++k) get(i, l+k, transpose) = t[k];
        for(int k = r; k < dim2(transpose); ++k) get(i, k, transpose) = '.';
    }
}
void ruch(char c) { // c=0 nic nie robi
    switch(c) {
        case 'L': gravity(1, 0); break;
        case 'G': gravity(0, 0); break;
        case 'D': gravity(0, 1); break;
        case 'P': gravity(1, 1); break;
    }
}
void wypisz() {
    for(auto &&e : v) cout << e << '\n';
}
char odwroc(char c) {
    switch(c) {
        case 'L': return 'P'; break;
        case 'G': return 'D'; break;
        case 'D': return 'G'; break;
        case 'P': return 'L'; break;
    }
    return 0;
}
string uprosc(string s, int offset) {
    string n;
    char pion = 0, poziom = 0;
    for(int i = offset; i < s.size(); ++i) {
        if(n.size() && s[i] == n.back()) continue;
        if(n.size() && s[i] == odwroc(n.back())) {
            n.pop_back();
            if(n.size()>=2) {
                char cc = n[n.size()-2];
                switch(cc) {
                    case 'L': case 'P': poziom = cc; break;
                    case 'D': case 'G': pion = cc; break;
                }
                continue;
            } else if(n.size() == 1) {
                switch(n[0]) {
                    case 'L': case 'P': pion = 0; break;
                    case 'D': case 'G': poziom = 0; break;
                }
            } else pion = poziom = 0;
        }
        char c = s[i];
        bool b = true;
        switch(c) {
            case 'L': case 'P': if(c==poziom) b = false; poziom = c; break;
            case 'D': case 'G': if(c==pion) b = false; pion = c; break;
        }
        if(b) n.push_back(s[i]);
    }
    return n;
}
int main() {
    cin >> n >> m;
    v.resize(n);
    for(auto &&e : v) cin >> e;
    int k; cin >> k;
    string s; cin >> s;
    char pion = 0, poziom = 0;
    bool poziom_pierwszy;
    int i;
    for(i = 0; i < s.size(); ++i) {
        if(pion && poziom) break;
        char c = s[i];
        switch(c) {
            case 'L': case 'P': poziom = c; if(!pion) poziom_pierwszy = true; break;
            case 'D': case 'G': pion = c; if(!poziom) poziom_pierwszy = false; break;
        }
    }
    if(poziom_pierwszy) { ruch(poziom); ruch(pion); }
    else { ruch(pion); ruch(poziom); }
    s = uprosc(s, i);
    for(auto &&e : s) ruch(e);
    wypisz();
}