题目链接: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; }