codeforces 762C

给你2个串  a b

去掉b中连续的长度最少的串  使得b剩下的串是a的字串 (可不连续)

输出去掉以后b的串

一开始就没半点思路  遇到C总是这样

看了看他们

先要n+m

预处理出 b 从前到后在a中可以匹配的 记录位子

            b 从后往前在a中可以匹配的 记录位子

然后二分删去的长度

记录位子

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<set>
#include<string>

using namespace std;
typedef long long LL;

#define MAXN 100010

char a[MAXN],b[MAXN];
int posl[MAXN],posr[MAXN];

int main()
{
    scanf("%s%s",a+1,b+1);
    int len1=strlen(a+1);
    int len2=strlen(b+1);
    int l,r;
    int j=1,k=len1;

    for(l=1;l<=len2;l++)
    {
        for(;j<=len1&&a[j]!=b[l];j++)
            ;
        posl[l]=j;
        j++;
    }
    posr[len2+1]=len1+1;
    for(r=len2;r>=1;r--)
    {
        for(;k>=1&&a[k]!=b[r];k--)
            ;
        posr[r]=k;
        k--;
    }
 //   printf("%d %d
",posr[3],r);
 //   printf("%d %d
",l,r);

        int ansl,ansr;
        l=0;
        r=len2;
        while(l<=r)
        {
            int mid=(l+r)>>1;
            int i;
            for(i=0;i+mid<=len2;i++)
                if(posl[i]<posr[i+mid+1])
                    break;
            if(i+mid<=len2)
                ansl=i,ansr=i+mid+1,r=mid-1;
            else
                l=mid+1;
        }
 //       printf("%d %d
",ansl,ansr);
        for(int i=1;i<=ansl;i++)
            printf("%c",b[i]);
        for(int i=ansr;b[i];i++)
            printf("%c",b[i]);
 //       printf("%d %d
",ansl,ansr);
        if(ansr-ansl>len2)
            printf("-");
        printf("
");

    return 0;
}
/*
abcbc
ac
*/
/*
for(l=0,r=lb;l<=r;)
    {
        mid=l+r>>1;
        for(i=0;i+mid<=lb;++i)if(fl[i]<fr[i+mid+1])break;
        if(i+mid<=lb)a1=i,a2=i+mid+1,r=mid-1;
        else l=mid+1;
    }
*/
/*aaeojkdyuilpdvyewjfrftkpcobhcumwlaoiocbfdtvjkhgda

mlmarpivirqbxcyhyerjoxlslyfzftrylpjyouypvk
*/
/*
abcda
dabda

*/
原文地址:https://www.cnblogs.com/cherryMJY/p/6423920.html