题目链接:https://www.luogu.org/problem/CF1203D2
题意:给你两个字符串s,t(长度为2e5),保证t是s的子序列,求问最大能在s中删子串的长度,且保证删后t还是s的子序列
分析:先求pre和last两个数组,分别保存最左边的满足t的子序列后最右边的满足t的子序列。
之后依次比较即可
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; const int maxn=2e5+7; const int mod=1e9+7; #define mem0(a) memset(a,0,sizeof(a)) #define meminf(a) memset(a,0x3f,sizeof(a)) #define ls rt<<1 #define rs rt<<1|1 #define mid (l+r)>>1 char s[maxn],t[maxn]; int pre[maxn],last[maxn]; int main(){ scanf("%s%s",s+1,t+1); int id=1; int slen=strlen(s+1),tlen=strlen(t+1); for(int i=1;i<=slen;i++){ if(s[i]==t[id]){ pre[id]=i; id++; } if(id>tlen)break; } id=tlen; for(int i=slen;i>=1;i--){ if(s[i]==t[id])last[id]=i,id--; if(id<1)break; } int ans=max(last[1]-1,slen-pre[tlen]); for(int i=1;i<=tlen;i++){ ans=max(ans,last[i+1]-pre[i]-1); } printf("%d ",ans); return 0; }