[CF1492C] Maximum width - 贪心

[CF1492C] Maximum width - 贪心

Description

有一串长度为 \(n\) 的字符串 \(s\) 和一串长度为 \(m\) 的字符串 \(t\),保证 \(2 \leq m \leq n \leq 2*10^5\)。定义序列 \(p\) : \(p_1,p_2...p_m\) 当且仅当其满足 : 对于\(1 \leq i \leq m\)中的每个 \(i\) ,都有 \(s_{p_i}=t_i\)。定义序列 \(p\) 的宽度为 \(max(p_{i+1}-p_i)\) 其中 $1 \leq i <m $。求这个宽度的最大值。

Solution

从左向右贪心匹配到 t 的第 i 个字符,用的代价为 li,从右向左为 ri

我们考虑枚举撑得最大的那个位置,那么直接求 max(l(i)+r(i+1)) 即可

#include <bits/stdc++.h>
using namespace std;

#define int long long

signed main()
{
    ios::sync_with_stdio(false);

    int n, m;
    string s, t;
    cin >> n >> m >> s >> t;
    s = " " + s;
    t = " " + t;

    vector<int> l(n + 2), r(n + 2);
    int p = 1;
    for (int i = 1; i <= n && p <= m; i++)
        if (s[i] == t[p])
            l[p++] = i;
    p = m;
    for (int i = n; i >= 1 && p >= 1; i--)
        if (s[i] == t[p])
            r[p--] = i;

    int ans = 0;
    for (int i = 1; i < m; i++)
        ans = max(ans, r[i + 1] - l[i]);

    cout << ans << endl;
}
上一篇:918. Maximum Sum Circular Subarray


下一篇:[Swift]LeetCode325. 最大子数组之和为k $ Maximum Size Subarray Sum Equals k