Submission #219382

# Submission time Handle Problem Language Result Execution time Memory
219382 2020-04-05T08:18:22 Z NONAME Trener (COCI20_trener) C++17
110 / 110
95 ms 6520 KB
#include <bits/stdc++.h>
#include <time.h>
//#include <random>
//#ifndef _LOCAL
//#pragma GCC optimize("-O3")
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")
//#endif
#define sz(x) int(x.size())
#define in(x) freopen(x, "r", stdin)
#define out(x) freopen(x, "w", stdout)
#define N 2 * 100500
#define oo ll(1e16)
#define pii pair <int, int>
#define pll pair <ll, ll>
#define ft first
#define sd second
#define pb push_back
#define ppb pop_back
#define mp make_pair
#define el '\n'
#define elf endl
#define base ll(1e9 + 7)
#define re return
#define nins 4294967295
using namespace std;
typedef long long ll;
typedef long double ld;

//mt19937 rnd(0);

ll n, m, dp[50][1510], upd[1510];
string s[50][1510];

void solve() {
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++)
            cin >> s[i][j];

        sort(s[i], s[i] + m);
    }

    for (int j = 0; j < m; j++)
        dp[n - 1][j] = 1;

    for (int i = n - 1; i > 0; i--) {
        for (int j = 0; j < m; j++)
            upd[j] = 0;

        for (int j = 0; j < m; j++) {
            string t1 = s[i][j].substr(0, i);
            string t2 = s[i][j].substr(1, i);

            int p1 = lower_bound(s[i - 1], s[i - 1] + m, t1) - s[i - 1];
            int p2 = upper_bound(s[i - 1], s[i - 1] + m, t1) - s[i - 1];

            upd[p1] += dp[i][j];
            upd[p1] %= base;
            upd[p2] -= dp[i][j];
            while (upd[p2] < 0) upd[p2] += base;
            upd[p2] %= base;

            if (t1 == t2) continue;

            p1 = lower_bound(s[i - 1], s[i - 1] + m, t2) - s[i - 1];
            p2 = upper_bound(s[i - 1], s[i - 1] + m, t2) - s[i - 1];

            upd[p1] += dp[i][j];
            upd[p1] %= base;
            upd[p2] -= dp[i][j];
            while (upd[p2] < 0) upd[p2] += base;
            upd[p2] %= base;
        }

        ll cr = 0;
        for (int j = 0; j < m; j++) {
            cr += upd[j];

            while (cr < 0) cr += base;
            cr %= base;

            dp[i - 1][j] += cr;
            dp[i - 1][j] %= base;
        }
    }

    ll rs = 0;
    for (int j = 0; j < m; j++)
        rs += dp[0][j], rs %= base;

    cout << rs;
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    #ifdef _LOCAL
        in("input.txt");

        int t = 1;
//        cin >> t;
        for (int i = 1; i <= t; i++) {
            cout << "Test #" << i << elf;

            clock_t start_time = clock();

            solve();

            cerr.precision(4); cerr << fixed;
            cerr << elf;
            cerr << "Time :: " << ld(clock() - start_time) / CLOCKS_PER_SEC << elf;

            cout << elf;
        }
    #else
        int t = 1;
//        cin >> t;

        while (t--) {
            solve();
            cout << el;
        }
    #endif
}
# Verdict Execution time Memory Grader output
1 Correct 6 ms 2688 KB Output is correct
2 Correct 6 ms 2688 KB Output is correct
3 Correct 6 ms 2688 KB Output is correct
4 Correct 6 ms 2688 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 10 ms 3200 KB Output is correct
2 Correct 10 ms 3072 KB Output is correct
3 Correct 10 ms 3072 KB Output is correct
4 Correct 8 ms 3072 KB Output is correct
5 Correct 11 ms 3072 KB Output is correct
6 Correct 11 ms 3072 KB Output is correct
7 Correct 12 ms 3072 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 2688 KB Output is correct
2 Correct 6 ms 2688 KB Output is correct
3 Correct 6 ms 2688 KB Output is correct
4 Correct 6 ms 2688 KB Output is correct
5 Correct 10 ms 3200 KB Output is correct
6 Correct 10 ms 3072 KB Output is correct
7 Correct 10 ms 3072 KB Output is correct
8 Correct 8 ms 3072 KB Output is correct
9 Correct 11 ms 3072 KB Output is correct
10 Correct 11 ms 3072 KB Output is correct
11 Correct 12 ms 3072 KB Output is correct
12 Correct 89 ms 6040 KB Output is correct
13 Correct 88 ms 6520 KB Output is correct
14 Correct 92 ms 6520 KB Output is correct
15 Correct 87 ms 6520 KB Output is correct
16 Correct 39 ms 6520 KB Output is correct
17 Correct 95 ms 6520 KB Output is correct
18 Correct 95 ms 6264 KB Output is correct
19 Correct 95 ms 6264 KB Output is correct
20 Correct 94 ms 6264 KB Output is correct
21 Correct 94 ms 6264 KB Output is correct
22 Correct 40 ms 6264 KB Output is correct