题目链接:​​http://codeforces.com/contest/779/problem/D​​​
题意:给你两个字符串s1,s2,再给你一个序列,按序列顺序删除s1中的元素,删除必须保证包含s2这个子串,问你最多能删除多少个字符
解析:因为给出了删除顺序,所以可以直接扫一遍一个一个删除来判断,但是判断的时间复杂度太高,降不下来,所以采用二分答案的方法来解决这道题

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <set>
#include <map>
using namespace std;
const int maxn = 1e6+100;
char a[maxn];
char b[maxn];
char tmp[maxn];
int c[maxn],n;
bool slove(int pos)
{
strcpy(tmp,a);
for(int i=0;i<pos;i++)
tmp[c[i]-1] = 0;
int res = 0;
for(int i=0;i<n;i++)
{
if(tmp[i]==b[res])
res++;
if(res==strlen(b))
return true;
}
if(res==strlen(b))
return true;
else
return false;
}
int main()
{
scanf("%s %s",a,b);
n = strlen(a);
for(int i=0;i<n;i++)
scanf("%d",&c[i]);
int l = 0,r = n;
int k = 100;
while(k--)
{
int mid = (l+r)/2;
if(slove(mid))
l = mid;
else
r = mid;
}
//printf("%d %d\n",l,r);
printf("%d\n",l);
return 0;
}