二分。
二分一下答案,然后验证一下删去那些位置之后,$t$串还是否是$s$的子序列。
#include<map> #include<set> #include<ctime> #include<cmath> #include<queue> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<functional> using namespace std; char s[200010],t[200010]; int x[200010]; char tmp[200010]; bool check(int p) { memset(tmp,0,sizeof tmp); strcpy(tmp,s); for(int i=1;i<=p;i++) tmp[x[i]] ='?'; int len = strlen(t); int u=0; for(int i=0;tmp[i];i++) { if(tmp[i]==t[u]) u++; if(u==len) return 1; } return 0; } int main() { scanf("%s%s",s,t); int n=strlen(s); for(int i=1;i<=n;i++) { scanf("%d",&x[i]); x[i]--; } int L=1,R=n,ans=0; while(L<=R) { int mid = (L+R)/2; if(check(mid)) ans=mid,L=mid+1; else R=mid-1; } printf("%d ",ans); return 0; }