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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <algorithm>


using namespace std;

#define pb push_back
#define mp make_pair
#define st first
#define nd second
#define x first
#define y second

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;

const int mod = 1000000007;

struct Table {
  int t[2][601];
};

int solve(Table &t, vector<bool>v){
    
    int ans = 0;

    for(auto d: v){
        
        if(d){
            // Jeśli weszło L 
            for(int i=600; i>0; i--){
                t.t[0][i] = t.t[0][i-1];
                t.t[1][i] = (t.t[1][i] + t.t[0][i])%mod;
                
            }
            t.t[0][0] = 0;
        }else{
            // Jeśli weszło P
            for(int i=0; i<600; i++){
                t.t[1][i] = t.t[1][i+1];
                t.t[0][i] = (t.t[0][i] + t.t[1][i])%mod;
            }
            t.t[1][600] = 0;
            
            ans = (ans + t.t[1][0])%mod;
            t.t[1][0] = 0;
            
        }
    }
    
    return ans;
}


int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n;
    cin >> n;
    
    vector<vector<bool> > dry;
    
    for(int i=0; i<n; i++){
        string d;
        cin >> d;
        
        vector<bool> db;
        for(int j=0; j<d.size(); j++){
            if(d[j]=='L'){
                db.pb(true);
            }else{
                db.pb(false);
            }
        }
        
        dry.pb(db);
    }
    
    // PREPROCESS
    
    vector<Table> pre;
    vector<int> pre_ans;
    
    for(auto d: dry){
        Table t;
        for(int i=0; i<2; i++){
            for(int j=0; j<601; j++){
                t.t[i][j] = 0;
            }
        }
        t.t[0][0] = 1;
        
        int ans = solve(t, d);
        pre.pb(t);
        pre_ans.pb(ans);
    }
    
    
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            Table t = pre[i];
            int ans = (solve(t, dry[j]) + pre_ans[i])%mod;
            cout << ans << " ";
        }
        cout << "\n";
    }
    
    
    
    return 0;
}