题意: 给出的t p 两个字符串,t 包含p中的所有字符,现在Nastya想按a[i]依次删除t中的字符,问她最多能删掉几个还能保证 t 中仍然有p子串
思路:串很长,单层循环也得O(10^5)吧,这也搜不了 DP也不行 暴力也想不出,看到学长说二分 一下就明白了……
但是要注意二分的那个条件是 (r-l>1),不然就无法跳出循环……
code
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 200005
char t[MAXN],p[MAXN];
int vis[MAXN],a[MAXN];
int len1,len2;
int OK(int x)
{
int i,j,cnt;
for(i=0;i<x;i++)
vis[a[i]-1]=1;
j=0;cnt=0;
for(i=0;i<len1;i++)
{
if(j==len2) break;
if(t[i]==p[j]&&!vis[i])
{
cnt++;j++;
}
}
if(cnt==len2)
return 1;
return 0;
}
int main()
{
scanf("%s",t);
scanf("%s",p);
len1=strlen(t);
len2=strlen(p);
for(int i=0;i<len1;i++)
scanf("%d",&a[i]);
int l,r,mid;
l=0;r=len1;
while(r-l>1)
{
memset(vis,0,sizeof(vis));
mid=(l+r)/2;
if(OK(mid))
l=mid;
else
r=mid;
}
printf("%d\n",l);
return 0;
}