题解:水题,二分法,暴力判断即可。
PS:下次看到求最值的题,一定要想到二分法。如果是最小值最大类问题,十成有十成是二分法!
代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 2e5 + 10;
char s1[maxn],s2[maxn];
int a[maxn];
int vis[maxn];
int n,m;
bool check(int k){
memset(vis,0,sizeof(vis));
for(int i = 1;i <= k;i++) vis[a[i]] = 1;
int tmp = 1;
for(int i = 1;i <= n;i++){
if(tmp > m) break;
if(!vis[i] && s1[i] == s2[tmp]) tmp++;
}
// printf("tmp: %d\n",tmp);
return (tmp > m);
}
int main()
{
scanf("%s",s1 + 1);s1[0] = ' ';
scanf("%s",s2 + 1);s2[0] = ' ';
n = strlen(s1) - 1;m = strlen(s2) - 1;
for(int i = 1;i <= n;i++) scanf("%d",&a[i]);
int left = 0,right = n + 1;
while(left + 1 < right){
int mid = (left + right) / 2;
if(check(mid))
left = mid;
else right = mid;
}
printf("%d\n",left);
return 0;
}