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就行。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }