codeforces 762C Strings

本文介绍了一种优化的字符串匹配算法,旨在解决特定场景下寻找最长子串的问题。具体而言,给定两个字符串a和b,目标是找到b中的一段连续子串,使得删除该子串后剩下的部分能构成a的一个子序列,并且要使得这段被删除的子串尽可能长。文章提供了详细的实现思路和完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:

给定两个字符串a,b(len105)

(len≤105),让你去b中的一个连续的字段,使剩余的b串中的拼接起来的两个串是a穿的子序列。最大化这个字串的长度。


思路:http://blog.youkuaiyun.com/wjl84945979/article/details/54800222

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+100;
char a[maxn],b[maxn];
int length_a,length_b,pre[maxn],suf[maxn];
void print_ans(int i,int j)
{
    for(int k=1;k<=i;k++)
        printf("%c",b[k]);
    for(int k=length_b-j+1;k<=length_b;k++)
        printf("%c",b[k]);
}
bool check(int i,int j)
{
    if(pre[i]+suf[j]<=length_a)
        return true;
    else
        return false;
}
int main(void)
{
    int j;
    int ans=0,ans_i=-1,ans_j=-1;
    scanf("%s%s",a+1,b+1);
    length_a=strlen(a+1);
    length_b=strlen(b+1);
    pre[0]=suf[0]=0;
    j=1;
    for(int i=1;i<=length_b;i++)
    {
        while((j<=length_a)&&(b[i]!=a[j]))
            j++;
        if(j<=length_a)
        {
            pre[i]=j;
            j++;
        }
        else
            pre[i]=1e6;
    }
    j=0;
    for(int i=0;i<length_b;i++)
    {
        while((j<length_a)&&(a[length_a-j]!=b[length_b-i]) )
            j++;
        if(j<length_a)
        {
            suf[i+1]=j+1;
            j++;
        }
        else
            suf[i+1]=1e6;
    }
    /*
    for(int i=1;i<=length_b;i++)
        printf("pre[%d]=%d   suf[%d]=%d\n",i,pre[i],i,suf[i]);
    */
    for(int i=0;i<=length_b;i++)//calculate max j for each i
    {
        int *pos=upper_bound(suf+1,suf+(length_b+1-i),length_a-pre[i]);
        j=pos-suf;
        if((j>=0)&&(pre[i]+suf[j-1]<=length_a)&&(i+j>ans))
        {
            ans=i+j-1;
            ans_i=i;
            ans_j=j-1;
            //cout<<i<<" "<<j-1<<endl;
        }
    }
    if(ans==0)
        printf("-");
    else
        print_ans(ans_i,ans_j);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值