给你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 */