#include <cstdio>
#include <cstring>
#include <algorithm>
#define scanf(...) scanf(__VA_ARGS__)?:0
using namespace std;
#define MOD 1000000007
int n, l[600];
char s[600][605], s1[1205];
int wynik[1205][605], wys[1205];
int licz(const char *s, int n) {
wynik[0][0] = 1;
wys[0] = 0;
int ol = 0, op = 0;
for (int i = 1; i <= n; i++) {
if (s[i] == 'L') {
wys[i] = min(wys[i-1] + 1, n/2);
for (int j = 0; j <= wys[i]; j++) wynik[i][j] = 0;
for (int j = 0; j <= wys[i-1]; j++) {
wynik[i][j] = (wynik[i][j] + wynik[i-1][j]) % MOD;
wynik[i][j+1] = (wynik[i-1][j] - (ol > 0 && wys[ol-1] >= j ? wynik[ol-1][j] : 0) + MOD) % MOD;
}
ol = i;
} else {
wys[i] = wys[i-1];
for (int j = 0; j <= wys[i]; j++) wynik[i][j] = 0;
for (int j = wys[i-1]; j > 0; j--) {
wynik[i][j] = (wynik[i][j] + wynik[i-1][j]) % MOD;
wynik[i][j-1] = (wynik[i-1][j] - (op > 0 && wys[op-1] >= j ? wynik[op-1][j] : 0) + MOD) % MOD;
}
wynik[i][0] = (wynik[i][0] + wynik[i-1][0]) % MOD;
op = i;
}
//for (int j = 0; j <= wys[i]; j++) printf("%d ", wynik[i][j]);
//puts("");
}
return (wynik[n][0] + MOD - 1) % MOD;
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf(" %s", s[i]);
l[i] = strlen(s[i]);
}
for (int i = 0; i < n; i++) {
memcpy(s1 + 1, s[i], l[i]);
for (int j = 0; j < n; j++) {
memcpy(s1 + l[i] + 1, s[j], l[j]);
s1[l[i] + l[j] + 1] = 0;
printf("%d ", licz(s1, l[i] + l[j]));
}
puts("");
}
}
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 | #include <cstdio> #include <cstring> #include <algorithm> #define scanf(...) scanf(__VA_ARGS__)?:0 using namespace std; #define MOD 1000000007 int n, l[600]; char s[600][605], s1[1205]; int wynik[1205][605], wys[1205]; int licz(const char *s, int n) { wynik[0][0] = 1; wys[0] = 0; int ol = 0, op = 0; for (int i = 1; i <= n; i++) { if (s[i] == 'L') { wys[i] = min(wys[i-1] + 1, n/2); for (int j = 0; j <= wys[i]; j++) wynik[i][j] = 0; for (int j = 0; j <= wys[i-1]; j++) { wynik[i][j] = (wynik[i][j] + wynik[i-1][j]) % MOD; wynik[i][j+1] = (wynik[i-1][j] - (ol > 0 && wys[ol-1] >= j ? wynik[ol-1][j] : 0) + MOD) % MOD; } ol = i; } else { wys[i] = wys[i-1]; for (int j = 0; j <= wys[i]; j++) wynik[i][j] = 0; for (int j = wys[i-1]; j > 0; j--) { wynik[i][j] = (wynik[i][j] + wynik[i-1][j]) % MOD; wynik[i][j-1] = (wynik[i-1][j] - (op > 0 && wys[op-1] >= j ? wynik[op-1][j] : 0) + MOD) % MOD; } wynik[i][0] = (wynik[i][0] + wynik[i-1][0]) % MOD; op = i; } //for (int j = 0; j <= wys[i]; j++) printf("%d ", wynik[i][j]); //puts(""); } return (wynik[n][0] + MOD - 1) % MOD; } int main() { scanf("%d", &n); for (int i = 0; i < n; i++) { scanf(" %s", s[i]); l[i] = strlen(s[i]); } for (int i = 0; i < n; i++) { memcpy(s1 + 1, s[i], l[i]); for (int j = 0; j < n; j++) { memcpy(s1 + l[i] + 1, s[j], l[j]); s1[l[i] + l[j] + 1] = 0; printf("%d ", licz(s1, l[i] + l[j])); } puts(""); } } |
English