CF1492C - Maximum width

Posted Luowaterbi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1492C - Maximum width相关的知识,希望对你有一定的参考价值。

1492C - Maximum width

题意:

给两个字符串s,t,从s中构造子序列=t。定义一个子序列的值为序列中所有相邻两个字母在s中下标之差的最大值。求所有子序列的最大值。

题解:

先算出最靠前的子序列,在求出最靠后的子序列。再用i+1的靠后子序列中的下标减去i的靠前的。这样相当于说这个子序列是有i的靠前的子序列和i+1的靠后的子序列组成的t,这样的差一定是最大的。

注意是子序列,下标要有序。我一开始没看到有序。。。

AC代码:

#include <cstdio>
#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <algorithm>
#include <cmath>
#include <set>
#include <map>
#include <iomanip>
#include <cstdlib>
#include <stack>
#include <cstring>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i<(b);i++)
#define lep(i,a,b) for(int i=(a);i>=(b);i--) 
#define lepp(i,a,b) for(int i=(a);i>(b);i--)
#define pii pair<int,int>
#define pll pair<long long,long long>
#define mp make_pair
#define All(x) x.begin(),x.end() 
#define ms(a,b) memset(a,b,sizeof(a)) 
#define INF 0x3f3f3f3f
#define INFF 0x3f3f3f3f3f3f3f3f
#define multi int T;scanf("%d",&T);while(T--) 
using namespace std;
typedef long long ll;
typedef double db;
const int N=2e5+5;
const int mod=1e9+7;
const db eps=1e-6;                                                                            
const db pi=acos(-1.0);
int n,m,ans=0,st[N],ed[N];
string s,t;
int main()
    #ifndef ONLINE_JUDGE
    freopen("D:\\\\work\\\\data.in","r",stdin);
    #endif
    cin>>n>>m>>s>>t;
    int j=0;
    rep(i,0,n-1)
        if(s[i]==t[j])
            st[j]=i;
            ++j;
            if(j==m) break;
        
    
    j=m-1;
    lep(i,n-1,0)
        if(s[i]==t[j])
            ed[j]=i;
            --j;
            if(j<0) break;
        
    
    rep(i,1,m-1) ans=max(ans,ed[i]-st[i-1]); 
    cout<<ans<<endl;

以上是关于CF1492C - Maximum width的主要内容,如果未能解决你的问题,请参考以下文章

CF 172Kk-Maximum Subsequence Sum

CF888E Maximum Subsequence-折半搜索

CF1092F Tree with Maximum Cost

CF888E Maximum Subsequence (折半枚举+ two-pointers)

[CF1082D]Maximum Diameter Graph

CF888E Maximum Subsequence