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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include <bits/stdc++.h>

using namespace std;

struct Car {
    int pos;
    bool starts;
};

typedef long double dbl_t;

constexpr dbl_t eps = 1e-10;

vector<Car> cars[4];
int v[4];

vector<Car> ReadLine(int L)
{
    vector<Car> l;
    char buf[L + 8];
    scanf("%s", buf);
    buf[0] = '.';
    buf[L] = '.';
    for (int i = 1; i <= L; ++i)
        if (buf[i] != buf[i - 1]) {
            bool starts = buf[i] == '#';
            l.push_back(Car{i - starts, starts});
        }
    reverse(l.begin(), l.end());
    return l;
}

struct Simulation
{
    dbl_t pos[4];
    dbl_t& t = pos[0];
    bool blocked[4];

    bool event[4];
    dbl_t dt;

    void TrySchedule(int i, int j)
    {
        int agent_speed = blocked[i] ? v[i] : v[0];
        if (agent_speed <= v[j])
            return;
        if (cars[j].back().starts != (i == j))
            return;
        dbl_t dist = cars[j].back().pos + t * v[j] - pos[i];
        dbl_t dt_cand = dist / (agent_speed - v[j]);
        if (dt_cand < dt - eps)
            for (int k = 1; k <= 3; ++k)
                event[k] = false;
        if (dt_cand <= dt + eps) {
            dt = dt_cand;
            event[j] = true;
        }
    }

    void Fix(int i, dbl_t new_pos)
    {
        while (!cars[i].empty()) {
            dbl_t p = cars[i].back().pos + v[i] * t;
            dbl_t new_pos_for_1 = p;
            if (cars[i].back().starts)
                p += eps;
            else
                p -= eps;
            if (p > new_pos)
                break;
            blocked[i] = cars[i].back().starts;
            if (i == 1 && blocked[i])
                pos[1] = new_pos_for_1;
            cars[i].pop_back();
        }
        if (!blocked[i])
            pos[i] = new_pos;
    }

    void NextEvent()
    {
        dt = numeric_limits<dbl_t>::max();
        for (int j = 1; j <= 3; ++j) {
            if (!cars[j].empty())
                for (int i = 1; i <= 3; ++i)
                    if (abs(i - j) <= 1)
                        TrySchedule(i, j);
        }
        for (int i = 1; i <= 3; ++i)
            pos[i] += (blocked[i] ? v[i] : v[0]) * dt;
        t += dt;
        for (int j = 1; j <= 3; ++j)
            if (event[j]) {
                blocked[j] = cars[j].back().starts;
                cars[j].pop_back();
            }
        if (event[1] && !blocked[1])
            pos[1] = pos[2];
        if (event[3] && !blocked[3])
            pos[3] = pos[2];
        if (event[2] && !blocked[2]) {
            if (pos[1] == pos[3])
                pos[2] = pos[1];
            else if (pos[1] > pos[3]) {
                pos[2] = pos[1];
                Fix(3, pos[2]);
            } else {
                pos[2] = pos[3];
                Fix(1, pos[2]);
            }
        }
        /*
        printf("t=%.9Lg:", t);
        for (int i = 1; i <= 3; ++i)
            printf(" %.9Lg%c", pos[i], blocked[i] ? '[' : '>');
        printf("\n");
        */
    }

    void Run()
    {
        for (int i = 0; i < 4; ++i) {
            pos[i] = 0.0;
            blocked[i] = false;
        }
        for (;;) {
            bool empty = true;
            for (int i = 1; i <= 3; i++)
                empty &= cars[i].empty();
            if (empty)
                break;
            NextEvent();
        }
    }
};

int main()
{
    int L;
    scanf("%d", &L);
    for (int i = 0; i < 4; ++i)
        scanf("%d", v + i);
    dbl_t v2 = v[2];
    for (int i = 0; i < 4; ++i)
        v[i] -= v2;
    for (int i = 1; i <= 3; ++i)
        cars[i] = ReadLine(L);
    Simulation s;
    s.Run();
    printf("%.15Lf\n", s.t);
    return 0;
}