CF 778A(当然是抄题解了)
Posted pedestrian6
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF 778A(当然是抄题解了)相关的知识,希望对你有一定的参考价值。
题意:给出a串,b串,b串一定是a串子序列,两串长度<=200000
同时给出一个长度为a串长度的序列,第i个数xi表示第i次操作删去a串第xi个元素,问最多做多少次操作,使b串仍为a子序列
http://codeforces.com/contest/778/problem/A
solution:二分答案,然后O(n)判断一下b串是否为a串子序列。
二分答案第一步没想到,主要是一开始没想到如何O(n)判断b串是否为此时a串子序列,这里不是判子串,只需要维护一个指针p就好
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define N (200010) 5 using namespace std; 6 char S1[N],S2[N]; 7 int n,m,T[N]; 8 bool Check(int time){ 9 int i,p=1; 10 for (i=1;i<=m;i++){ 11 while ((S1[p]!=S2[i]||T[p]<=time)&&p<=n) 12 p++; 13 if (p>n) return 0; 14 p++; 15 } 16 return 1; 17 } 18 int main(){ 19 cin>>(S1+1)>>(S2+1); 20 n=strlen(S1+1); m=strlen(S2+1); 21 int i; 22 for (i=1;i<=n;i++){ 23 int x; scanf("%d",&x); 24 T[x]=i; 25 } 26 int l=1,r=n,ans=0; 27 while (l<=r){ 28 int mid=(l+r)>>1; 29 if (Check(mid)) ans=mid,l=mid+1; 30 else r=mid-1; 31 } 32 cout<<ans; 33 }
以上是关于CF 778A(当然是抄题解了)的主要内容,如果未能解决你的问题,请参考以下文章