题目概述
给出两个串
A,B
,现在需要删除
B
中的一个子串使删除后的
解题报告
枚举
那么只有当 pre<suf 且 MIN(pre)<MAX(suf) 的时候删除方案才成立,由于都是单调的,所以用two-pointer优化一下就可以了。
示例程序
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100000;
char A[maxn+5],B[maxn+5];
int n,m,pre,suf,pos[maxn+5];
int ans,P,S;
int main()
{
scanf("%s%s",A+1,B+1);n=strlen(A+1);m=strlen(B+1);
int j=n;suf=m;
while (suf>=1)
{
while (j>=1&&A[j]!=B[suf]) j--;if (j<1) break;
pos[suf]=j;suf--;j--;
}
suf++;if (m-suf+1>ans) ans=m-suf+1,P=0,S=suf;
pre=1;j=1;
while (pre<=m)
{
while (j<=n&&A[j]!=B[pre]) j++;if (j>n) break;
while (suf<=m&&suf<=pre) suf++;
while (suf<=m&&pos[suf]<=j) suf++;
if (pre+m-suf+1>ans) ans=pre+m-suf+1,P=pre,S=suf;
pre++;j++;
}
if (!ans) return puts("-"),0;
for (int i=1;i<=P;i++) putchar(B[i]);
for (int i=S;i<=m;i++) putchar(B[i]);
return putchar('\n'),0;
}