1492C-最大幅
題名:
2つの文字列sとtが与えられた場合、sからサブシーケンス= tを作成します。サブシーケンスは、シーケンス内の隣接する2文字すべての添え字間の差の最大値として定義します。すべてのサブシーケンスの最大値を見つけます。
回答:
最初のサブシーケンスが最初に計算され、最後のサブシーケンスが計算されます。次に、i +1の下のサブシーケンスの添え字からiの最初のサブシーケンスを減算します。これは、このサブシーケンスがiの最初のサブシーケンスとi + 1の後者のサブシーケンスで構成されていると言うことと同じであり、この差は最大でなければなりません。
これはサブシーケンスであり、添え字は順番に並んでいる必要があることに注意してください。最初は注文がわかりませんでした。。。
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;
}