[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;
}