Codeforces 1203D2 Remove the Substring (hard version)

Posted qingjiuling

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

 

以上是关于Codeforces 1203D2 Remove the Substring (hard version)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #450 (Div. 2) C. Remove Extra One 题解

Codeforces 821C Okabe and Boxes

Codeforces 821C Okabe and Boxes(模拟)

C. Remove Adjacent

Codeforces Round #420 C

CodeForces 19D Points(线段树+map)