codeforce-------D2. Remove the Substring (hard version)

题意很好懂,给你一个s串和t串要求删除s中的一部分,使得剩下的s仍然是t的substring。

题目链接

思路:从s串前面顺序找一遍t串的位置(假设找到的串为s1),再从s串的后面倒序找一遍t的位置(假设找到的串为s2),那么要删除的串有三种可能:

1、在s1前面。2、在s2后面。3、在s1和s2的中间;

然后就比较一下哪一个最大就可以了。

代码如下:

#include<bits/stdc++.h>
//#include<queue>
#include <queue>
#include <cstdio>
#include<cstring>
//#include <string>
#define debug(x) cout<<'x'<<' '<<x<<endl;
const int INF=0x3f3f3f3f;
typedef long long ll;
const int maxn = 5e5+5;
const int mod =1e9+7;
using namespace std;
typedef long long ll;
char s[maxn],t[maxn];
int pre[maxn],last[maxn];
int main()
{
    scanf("%s%s",s+1,t+1);
    int slen=strlen(s+1);
    int tlen=strlen(t+1);
    int id=1;
    for(int i=1;i<=slen;i++)
    {
        if(s[i]==t[id])
        {
            pre[id++]=i;
            if(id>tlen)break;
        }
    }
    id=tlen;
    for(int i=slen;i>=1;i--)
    {
        if(t[id]==s[i])
        {
            last[id--]=i;
            if(id<=0)break;
        }
    }
    int ans=max(last[1]-1,slen-pre[tlen]);
    for(int i=1;i<=tlen-1;i++)
    {
        ans=max(ans,last[i+1]-pre[i]-1);
    }
    printf("%d
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/kayiko/p/11365150.html