题目链接:http://codeforces.com/contest/1203/problem/D2
题目大意:给定一个母串和一个子串,求在母串中删掉一个最长连续数列的同时保证在剩余母串里能找到子串(可以不连续但不能顺序颠倒)
输出就三种情况。前面,后面,中间
中间的情况:
如图L[i]:T[i]在S中的最早位置。
如图L[i]:T[i]在S中的最末位置。
那么输出第i个字符和第i+1个字符的间隙。最多删除R[i+1]-L[i]-1个字符。
#include<bits/stdc++.h>
using namespace std;
char s[200005], t[200005];
int L[200005]={0}, R[200005]={0};
int main()
{
scanf("%s%s", s+1, t+1);
int n=strlen(s+1), m=strlen(t+1);
int j=1;
for(int i=1; i<=n&&j<=m; i++){
if(s[i]==t[j]){
L[j]=i, j++;
}
}
j=m;
for(int i=n; i>=1&&j>=1; i--){
if(s[i]==t[j]){
R[j]=i, j--;
}
}
int ans=max(R[1]-1, n-L[m]);//删除两端的间隙
for(int i=1; i<n; i++){
ans=max(ans, R[i+1]-L[i]-1);//输出中间某个字符的间隙
}
printf("%d\n", ans);
return 0;
}