Codeforces 1203D2 Remove the Substring (hard version)

题目链接: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\n",ans);
    return 0;
}

 

posted @ 2019-10-02 19:55  清酒令  阅读(211)  评论(0编辑  收藏  举报