답안 #931667

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
931667 2024-02-22T08:35:17 Z Whisper Trener (COCI20_trener) C++17
110 / 110
600 ms 45640 KB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

#define int long long
#define FOR(i, a, b) for ( int i = a ; i <= b ; i++ )
#define FORD(i, a, b) for (int i = b; i >= a; i --)
#define REP(i, n) for (int i = 0; i < n; ++i)
#define REPD(i, n) for (int i = n - 1; i >= 0; --i)
#define pii pair<int , int>
#define Lg(x) 31 - __builtin_clz(x)

#define MASK(i) (1LL << (i))
#define BIT(x, i) (((x) >> (i)) & 1)

constexpr ll LINF = (1ll << 60);
constexpr int INF = (1ll << 30);
constexpr int MAX = 2e3 + 5;
constexpr int Mod = 1e9 + 7;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

void setupIO(){
    #define name "Whisper"
    //Phu Trong from Nguyen Tat Thanh High School for gifted student
    srand(time(NULL));
    cin.tie(nullptr)->sync_with_stdio(false); cout.tie(nullptr);
    //freopen(name".inp", "r", stdin);
    //freopen(name".out", "w", stdout);
    cout << fixed << setprecision(10);
}

template <class X, class Y>
    bool minimize(X &x, const Y &y){
        X eps = 1e-9;
        if (x > y + eps) {x = y; return 1;}
        return 0;
    }

template <class X, class Y>
    bool maximize(X &x, const Y &y){
        X eps = 1e-9;
        if (x + eps < y) {x = y; return 1;}
        return 0;
    }
int nGroup, nMember;
string s[51][MAX];
int Hash[51][MAX][51], Pow[MAX];

int getHash(int i, int j, int l, int r){
    return (Hash[i][j][r] - Pow[r - l + 1] * Hash[i][j][l - 1] % Mod + Mod) % Mod;
}

int dp[MAX][MAX];

void add(int &x, int y){
    x += y;
    if (x >= Mod) x -= Mod;
}
void sub(int &x, int y){
    x -= y;
    if (x < 0) x %= Mod;
}

#define Base 293
void Whisper(){
    cin >> nGroup >> nMember;
    FOR(i, 1, nGroup) FOR(j, 1, nMember) cin >> s[i][j];
    Pow[0] = 1;
    for (int i = 1; i <= nGroup; ++i) Pow[i] = Pow[i - 1] * Base % Mod;

    FOR(i, 1, nGroup) FOR(j, 1, nMember){
        for (int v = 1; v <= (int)s[i][j].size(); ++v){
            Hash[i][j][v] = (Hash[i][j][v - 1] * Base + s[i][j][v - 1] - 'a' + 1) % Mod;
        }
    }
    for (int i = 1; i <= nMember; ++i) dp[1][i] = 1;
    FOR(i, 2, nGroup) FOR(cur, 1, nMember) FOR(prv, 1, nMember){
        for (int v = 0; v <= 1; ++v){
            if (getHash(i - 1, prv, 1, i - 1) == getHash(i, cur, v + 1, (i - 1) + v)){
                add(dp[i][cur], dp[i - 1][prv]);
                break;
            }
        }
    }
    int ans = 0;
    for (int i = 1; i <= nMember; ++i) add(ans, dp[nGroup][i]);
    cout << ans;
}


signed main(){
    setupIO();
    int Test = 1;
//    cin >> Test;
    for ( int i = 1 ; i <= Test ; i++ ){
        Whisper();
        if (i < Test) cout << '\n';
    }
}


# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 5976 KB Output is correct
2 Correct 1 ms 5976 KB Output is correct
3 Correct 1 ms 5980 KB Output is correct
4 Correct 1 ms 5980 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 10588 KB Output is correct
2 Correct 6 ms 10624 KB Output is correct
3 Correct 7 ms 10584 KB Output is correct
4 Correct 7 ms 10584 KB Output is correct
5 Correct 7 ms 10584 KB Output is correct
6 Correct 7 ms 10588 KB Output is correct
7 Correct 6 ms 10588 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 5976 KB Output is correct
2 Correct 1 ms 5976 KB Output is correct
3 Correct 1 ms 5980 KB Output is correct
4 Correct 1 ms 5980 KB Output is correct
5 Correct 6 ms 10588 KB Output is correct
6 Correct 6 ms 10624 KB Output is correct
7 Correct 7 ms 10584 KB Output is correct
8 Correct 7 ms 10584 KB Output is correct
9 Correct 7 ms 10584 KB Output is correct
10 Correct 7 ms 10588 KB Output is correct
11 Correct 6 ms 10588 KB Output is correct
12 Correct 595 ms 42836 KB Output is correct
13 Correct 592 ms 42816 KB Output is correct
14 Correct 589 ms 42944 KB Output is correct
15 Correct 591 ms 42960 KB Output is correct
16 Correct 404 ms 42832 KB Output is correct
17 Correct 600 ms 43176 KB Output is correct
18 Correct 600 ms 43344 KB Output is correct
19 Correct 591 ms 44884 KB Output is correct
20 Correct 593 ms 44880 KB Output is correct
21 Correct 599 ms 45420 KB Output is correct
22 Correct 403 ms 45640 KB Output is correct