跳转至

习题

习题一

Problem - G - Codeforces

串T在串S(含问号)中出现的最大次数

代码
C++
#include <bits/stdc++.h>
using namespace std;
// 2023 OneWan
vector<int> prefix(const string str) {
    int len = str.size();
    vector<int> nxt(len);
    for (int i = 2 ; i < len ; i++) {
        int j = nxt[i - 1];
        while (j && str[i] != str[j + 1]) {
            j = nxt[j];
        }
        if (str[i] == str[j + 1]) j++;
        nxt[i] = j;
    }
    return nxt;
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    string a, b;
    cin >> a >> b;
    int n = a.size(), m = b.size();
    a = " " + a;
    b = " " + b;
    auto kmp = prefix(b);
    vector nxt(m + 1, vector(26, 0));
    for (int i = 1 ; i <= m + 1 ; i++) {
        for (int j = 0 ; j < 26 ; j++) {
            if (i <= m && b[i] == 'a' + j) {
                nxt[i - 1][j] = i;
            } else {
                nxt[i - 1][j] = nxt[kmp[i - 1]][j];
            }
        }
    }
    vector dp(n + 1, vector(m + 1, -100000000));
    dp[0][0] = 0;
    for (int i = 1 ; i <= n ; i++) {
        for (int j = 0 ; j <= m ; j++) {
            if (a[i] == '?') {
                for (int k = 0 ; k < 26 ; k++) {
                    dp[i][nxt[j][k]] = max(dp[i][nxt[j][k]], dp[i - 1][j]);
                }
            } else {
                dp[i][nxt[j][a[i] - 'a']] = max(dp[i][nxt[j][a[i] - 'a']], dp[i - 1][j]);
            }
        }
        dp[i][m]++;
    }
    int mx = 0;
    for (int i = 0 ; i <= m ; i++) mx = max(mx, dp[n][i]);
    cout << mx;
    return 0;
}