提出 #75869291


ソースコード 拡げる

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MOD = 998244353;
const int ALPH = 26;
const int MAX_NODES = 101;
struct Matrix {
    int sz;
    vector<vector<int>> a;
    Matrix(int n) : sz(n), a(n, vector<int>(n, 0)) {}
    Matrix operator*(const Matrix& other) const {
        Matrix res(sz);
        for (int i = 0; i < sz; ++i)
            for (int k = 0; k < sz; ++k)
                if (a[i][k])
                    for (int j = 0; j < sz; ++j)
                        res.a[i][j] = (res.a[i][j] + (ll)a[i][k] * other.a[k][j]) % MOD;
        return res;
    }
};
Matrix mat_pow(Matrix base, ll exp) {
    int n = base.sz;
    Matrix res(n);
    for (int i = 0; i < n; ++i) res.a[i][i] = 1;
    while (exp) {
        if (exp & 1) res = res * base;
        base = base * base;
        exp >>= 1;
    }
    return res;
}
struct AhoNode {
    int next[ALPH];
    int fail;
    bool danger;
};
vector<AhoNode> trie;
void insert(const string& s) {
    int u = 0;
    for (char ch : s) {
        int c = ch - 'a';
        if (!trie[u].next[c]) {
            trie[u].next[c] = trie.size();
            trie.emplace_back();
        }
        u = trie[u].next[c];
    }
    trie[u].danger = true;
}
void build_fail() {
    queue<int> q;
    for (int c = 0; c < ALPH; ++c) {
        int v = trie[0].next[c];
        if (v) {
            trie[v].fail = 0;
            q.push(v);
        } else {
            trie[0].next[c] = 0;
        }
    }
    while (!q.empty()) {
        int u = q.front(); q.pop();
        trie[u].danger |= trie[trie[u].fail].danger;
        for (int c = 0; c < ALPH; ++c) {
            int v = trie[u].next[c];
            if (v) {
                trie[v].fail = trie[trie[u].fail].next[c];
                q.push(v);
            } else {
                trie[u].next[c] = trie[trie[u].fail].next[c];
            }
        }
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    ll N;
    int K;
    cin >> N >> K;
    trie.clear();
    trie.emplace_back();
    for (int i = 0; i < K; ++i) {
        string s;
        cin >> s;
        insert(s);
    }
    build_fail();
    vector<int> good_nodes;
    for (int i = 0; i < (int)trie.size(); ++i) {
        if (!trie[i].danger) good_nodes.push_back(i);
    }
    int M = good_nodes.size();
    vector<int> id(trie.size(), -1);
    for (int i = 0; i < M; ++i) id[good_nodes[i]] = i;
    Matrix mat(M);
    for (int i = 0; i < M; ++i) {
        int u = good_nodes[i];
        for (int c = 0; c < ALPH; ++c) {
            int v = trie[u].next[c];
            if (!trie[v].danger) {
                int j = id[v];
                mat.a[i][j] = (mat.a[i][j] + 1) % MOD;
            }
        }
    }
    Matrix matN = mat_pow(mat, N);
    vector<int> init(M, 0);
    init[id[0]] = 1;
    ll ans = 0;
    for (int i = 0; i < M; ++i) {
        ll sum = 0;
        for (int k = 0; k < M; ++k) {
            sum = (sum + (ll)init[k] * matN.a[k][i]) % MOD;
        }
        ans = (ans + sum) % MOD;
    }
    cout << ans;
    return 0;
}

提出情報

提出日時
問題 F - Critical Misread
ユーザ zkl018
言語 C++23 (GCC 15.2.0)
得点 525
コード長 3173 Byte
結果 AC
実行時間 38 ms
メモリ 3788 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 525 / 525
結果
AC × 3
AC × 60
セット名 テストケース
Sample sample_01.txt, sample_02.txt, sample_03.txt
All sample_01.txt, sample_02.txt, sample_03.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt, test_28.txt, test_29.txt, test_30.txt, test_31.txt, test_32.txt, test_33.txt, test_34.txt, test_35.txt, test_36.txt, test_37.txt, test_38.txt, test_39.txt, test_40.txt, test_41.txt, test_42.txt, test_43.txt, test_44.txt, test_45.txt, test_46.txt, test_47.txt, test_48.txt, test_49.txt, test_50.txt, test_51.txt, test_52.txt, test_53.txt, test_54.txt, test_55.txt, test_56.txt, test_57.txt
ケース名 結果 実行時間 メモリ
sample_01.txt AC 1 ms 3448 KiB
sample_02.txt AC 1 ms 3532 KiB
sample_03.txt AC 6 ms 3780 KiB
test_01.txt AC 1 ms 3520 KiB
test_02.txt AC 1 ms 3572 KiB
test_03.txt AC 2 ms 3644 KiB
test_04.txt AC 1 ms 3516 KiB
test_05.txt AC 1 ms 3456 KiB
test_06.txt AC 1 ms 3532 KiB
test_07.txt AC 1 ms 3516 KiB
test_08.txt AC 38 ms 3704 KiB
test_09.txt AC 29 ms 3752 KiB
test_10.txt AC 1 ms 3548 KiB
test_11.txt AC 1 ms 3532 KiB
test_12.txt AC 1 ms 3492 KiB
test_13.txt AC 1 ms 3516 KiB
test_14.txt AC 27 ms 3712 KiB
test_15.txt AC 36 ms 3776 KiB
test_16.txt AC 1 ms 3448 KiB
test_17.txt AC 7 ms 3616 KiB
test_18.txt AC 1 ms 3620 KiB
test_19.txt AC 1 ms 3440 KiB
test_20.txt AC 1 ms 3456 KiB
test_21.txt AC 1 ms 3520 KiB
test_22.txt AC 2 ms 3616 KiB
test_23.txt AC 12 ms 3660 KiB
test_24.txt AC 1 ms 3476 KiB
test_25.txt AC 1 ms 3660 KiB
test_26.txt AC 1 ms 3532 KiB
test_27.txt AC 2 ms 3660 KiB
test_28.txt AC 2 ms 3660 KiB
test_29.txt AC 2 ms 3780 KiB
test_30.txt AC 2 ms 3776 KiB
test_31.txt AC 1 ms 3492 KiB
test_32.txt AC 3 ms 3700 KiB
test_33.txt AC 5 ms 3660 KiB
test_34.txt AC 2 ms 3704 KiB
test_35.txt AC 9 ms 3776 KiB
test_36.txt AC 4 ms 3584 KiB
test_37.txt AC 2 ms 3584 KiB
test_38.txt AC 1 ms 3644 KiB
test_39.txt AC 1 ms 3660 KiB
test_40.txt AC 1 ms 3648 KiB
test_41.txt AC 14 ms 3616 KiB
test_42.txt AC 2 ms 3724 KiB
test_43.txt AC 1 ms 3660 KiB
test_44.txt AC 2 ms 3648 KiB
test_45.txt AC 6 ms 3648 KiB
test_46.txt AC 9 ms 3616 KiB
test_47.txt AC 7 ms 3724 KiB
test_48.txt AC 3 ms 3620 KiB
test_49.txt AC 5 ms 3676 KiB
test_50.txt AC 35 ms 3788 KiB
test_51.txt AC 24 ms 3788 KiB
test_52.txt AC 8 ms 3644 KiB
test_53.txt AC 4 ms 3660 KiB
test_54.txt AC 7 ms 3584 KiB
test_55.txt AC 3 ms 3740 KiB
test_56.txt AC 14 ms 3660 KiB
test_57.txt AC 10 ms 3780 KiB