题目链接:https://codeforces.com/contest/1203/problem/D2
思路:先用一个子串t中的字符在主串s中的最靠右位置pos[i],根据这个最靠有位置,遍历一遍s字符串,每次最大删除长度就是当前位置到pos[i](因为尽可能靠右,所以是尽可能大的)的距离。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int pos[maxn];
int main() {
string s,t;
ios::sync_with_stdio(0);
cin >> s >> t;
int ans = 0;
for(int i = t.length() - 1; i >= 0; i--) {
int tmp;
if(i < t.length() - 1)tmp = pos[i+1] - 1;
else tmp = s.length() - 1;
while(tmp >= 0 && s[tmp] != t[i])tmp--;
pos[i] = tmp;
}
int cnt = 0;
for(int i = 0 ; i < s.length(); i++) {
int tmp = s.length() - 1;
if(cnt < t.length()) tmp = pos[cnt] - 1;
ans = max(ans,tmp - i + 1);
if(cnt < t.length() && t[cnt] == s[i])cnt++;
}
cout << ans << "\n";
return 0;
}