CodeForces 779D. String Game(二分答案)

题目链接: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;
}
原文地址:https://www.cnblogs.com/TnT2333333/p/6561000.html