D. String Game

来源:互联网 发布:sql insert date 编辑:程序博客网 时间:2024/06/05 16:42

题意:给你 一个字符串 t, 一个字符串 p,在给你一个序列a[i], 去掉 字符串中 下标为 a[i] 的字符。问你求出序列个数的最大值,使得p为t 的子字符串。

解法: 有字符串 t,p;
如果在 ,m time后 p 刚好是 t 的子串。
那么在 m-1 次前肯定是可以去掉字符的,m-1次之后肯定是不能去掉字符的。
所以直接 2 分区间 ,得到 m. 如何 m 次移动是合法的话, 就增加m,反之减小m.

#include <bits\stdc++.h>using namespace std;int a[200005], mark[200005], n,m;string t,p;int check(int num){    for(int i=0;i<n;i++) mark[i] = 0;    for(int i=0;i<num;i++) mark[ a[i] ] = 1;    int leng=0, start = 0;    for(int i=0;i<n;i++)    {        if(!mark[i])        {            if(t[i] == p[start])            {                leng++;                start++;                if(leng >= m) // t 字符串中海油 字符串 p                 {                    return 1;                }            }        }    }    return 0;}int main(){    cin>>t>>p;    n = t.length(),m = p.length();    for(int i=0;i<n;i++)     {        cin>>a[i];        a[i]-=1;    }    int l = 1, r = n, ans=0;    while(l <= r)    {        int mid = (l+r)/2;        if(check(mid))         {            ans = max(ans, mid);            l = mid+1;         }         else r = mid-1;    }    printf("%d\n",ans);    return 0;} 
0 0