首页 > 代码库 > Codeforces Round #402 (Div. 2) D. String Game

Codeforces Round #402 (Div. 2) D. String Game

题目链接:Codeforces Round #402 (Div. 2) D. String Game

题意:

给你两个字符串a,b,然后给你n=strlen(a)个数字n1,n2,...,nn,表示依次删a[ni-1]个字符。

当a串删到有k(k任意)个子串组合起来(顺序不变)刚好等于b串时,就不能删了。

比如 abba->(ab a) 刚好包括 aba ,bba不包括aab。

问最多能删多少次。

题解:

最开始还以为是要用某种数据结构啥的,结果都想复杂了,直接二分答案就行。

然后线性判断删掉后的串是否包括b就行。

 

技术分享
 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;++i)
 3 using namespace std;
 4 
 5 const int N=2e5+7;
 6 
 7 bool vis[N];
 8 char a[N],b[N];
 9 int c[N],n,m;
10 
11 int check(int mid)
12 {
13     F(i,1,n)vis[i]=0;
14     F(i,mid+1,n)vis[c[i]]=1;
15     int cnt=1;
16     F(i,1,n)
17     {
18         if(!vis[i])continue;
19         if(a[i]==b[cnt])cnt++;
20         if(cnt>m)return 1;
21     }
22     return 0;
23 }
24 
25 int main(){
26     scanf("%s%s",a+1,b+1);
27     n=strlen(a+1),m=strlen(b+1);
28     F(i,1,n)scanf("%d",c+i);
29     int l=0,r=n-1,mid,ans;
30     while(l<=r)
31     {
32         mid=l+r>>1;
33         check(mid)?l=mid+1,ans=mid:r=mid-1;
34     }
35     printf("%d\n",ans);
36     return 0;
37 }
View Code

 

Codeforces Round #402 (Div. 2) D. String Game