题意 给出string s,t t为s的子序列,现在按照数组p的顺序,删除s中的字符,求最多删除多少次使得t仍然为s的子序列?
如果删除到第i步不成立 则显然删除到j(j>i)肯定也不成立
删除到第i步成立 则在往前面也可能成立
二分最多能删除到第x次 记f[i]为s的第i个字符第几次被删除,则f[i]<=x,表示s[i]被删除,O(n)判断t是否为s的子序列即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+20;
char s[N],t[N];
int p[N];
int f[N];//f[i] 位置i第几步被删除
int len,n;
bool check(int x)
{
int q=1;
for(int i=1;i<=n;i++)
{
if(s[i]==t[q]&&f[i]>x)
{
q++;
}
}
if(q>len)
return true;
else
return false;
}
int main()
{
while(scanf("%s",s+1)!=EOF)
{
scanf("%s",t+1);
len=strlen(t+1),n=strlen(s+1);
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i]);
f[p[i]]=i;//
}
int l=0,r=n,ans=0;
//二分删到第x步
while(l<=r)
{
int mid=(l+r)/2;
if(check(mid))
{
ans=mid;
l=mid+1;
}
else
r=mid-1;
}
cout<<ans<<endl;
}
return 0;
}