题目链接:http://codeforces.com/problemset/problem/779/D
题意:有两个字符串一个初始串一个目标串,有t次机会删除初始串的字符问最多操作几次后刚好凑不成目标串
所得结果减1
其实简单匹配只需要n只要二分查找一下答案那么结果就是n*logn
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
const int M = 2e5 + 10;
string p , t;
int a[M] , l , r , mid;
bool vis[M];
bool find(int pos) {
int len = t.size() , len2 = p.size();
int count = 0;
for(int i = 0 ; i < len ; i++) {
if(i <= mid) {
vis[a[i] - 1] = false;
}
else {
vis[a[i] - 1] = true;
}
}
for(int i = 0 ; i < len ; i++) {
if(vis[i]) {
if(t[i] == p[count]) {
count++;
}
}
if(count == len2)
return true;
}
return false;
}
int main() {
cin >> t >> p;
int len = t.size();
for(int i = 0 ; i < len ; i++) {
cin >> a[i];
vis[i] = true;
}
l = 0 , r = len - 1;
while(l <= r) {
mid = (l + r) >> 1;
int flag = find(mid);
if(flag) {
l = mid + 1;
}
else {
r = mid - 1;
}
}
cout << r + 1 << endl;
return 0;
}