Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
42110 Gapple 【S】T4 C++ 通过 100 455 MS 249600 KB 1838 2026-06-13 14:32:24

Tests(10/10):


#include <iostream> #include <string> #include <vector> using namespace std; using i64 = long long; constexpr int MOD = 998244353; struct mint { int val; mint() : val(0) { } mint(i64 x) : val(x % MOD) { if (val < 0) val += MOD; } static mint raw(int x) { if (x >= MOD) x -= MOD; else if (x < 0) x += MOD; mint res; res.val = x; return res; } friend mint operator+(mint x, mint y) { return raw(x.val + y.val); } friend mint operator*(mint x, mint y) { return i64(x.val) * y.val; } friend mint& operator+=(mint& x, mint y) { return x = x + y; } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); string S, s1, s2; cin >> S >> s1 >> s2; int n = S.size(), n1 = s1.size(), n2 = s2.size(); S = ' ' + S; s1 = ' ' + s1; s2 = ' ' + s2; vector<vector<vector<mint>>> f(n + 1, vector<vector<mint>>(n1 + 1, vector<mint>(n2 + 1))); for (int i = 1; i <= n; ++i) { for (int j = 0; j <= n1; ++j) { for (int k = 0; k <= n2; ++k) { f[i][j][k] = f[i - 1][j][k]; if (j > 0 && S[i] == s1[j]) f[i][j][k] += j == 1 && k == 0 ? i : f[i - 1][j - 1][k]; if (k > 0 && S[i] == s2[k]) f[i][j][k] += j == 0 && k == 1 ? i : f[i - 1][j][k - 1]; if (j > 0 && k > 0 && S[i] == s1[j] && S[i] == s2[k]) f[i][j][k] += j == 1 && k == 1 ? i : f[i - 1][j - 1][k - 1]; } } } mint ans; for (int i = 1; i <= n; ++i) ans += f[i][n1][n2]; cout << ans.val << '\n'; return 0; }


测评信息: