[説明] AGC007E息コピー文字列(貪欲)

[説明] AGC007E息コピー文字列(貪欲)

タイトルを読んで最初にそれがラットの穴モデルだと思ったが、ここで見つけるもバナナの種類が一致することはできません必要ですが、価格は一定ではありません...

追跡結果の文字列\(T \)各文字\(T_I \)源は、それが向けられることがあり(P <I \)\、このラインを覆う見出すことができる折り目の\(X \)軸できるだけ小さく長さは、最終的な答えは、このような折れ線の変曲点まで一致折り目の全ての形態として、変曲点の数です。キューは、端部の一組で現在の一致を維持する変曲点\(X \)前方の観点からは、座標(\ T \)各文字に一致します。

現在セット列挙する\(T_I \) および\(T_ {I + 1} \) に一致\(S_P \)を、両端キューは、変曲点のすべての座標を維持します。最大考える\(P '<P、S_のPを{'} = T_I \)

  • もし\(P = P「\) 次いで\(T_ {I + 1} \) から直接、\(T_I \)過去には、次に継承\(T_Iが\)変曲点と一致する点は、I +ポリライン全ての座標であります\(<I \)変曲点。
  • 場合(P-\ P-ない=「\)\、そして確実に起因する\(X \)可能な限り小さくスパンを、最高の新しいポリラインは、すべての破線(座標+ 1)の最後のプラス(必要とされるようでなければなりませんこの時間を一致させるために- \( '\ P) コーナリングを。

コード

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>

using namespace std;  typedef long long ll;
int n,ans;
const int maxn=1e6+5;
char S[maxn],T[maxn];
deque<int> q;
int main(){
    scanf("%d%s%s",&n,S+1,T+1);
    q.push_back(n+1);
    for(int t=n,p=n+1,offset=0;t;--t){
        int sav=p;
        while(p&&(p>t||S[p]!=T[t])) --p;
        if(p<1) puts("-1"),exit(0);
        if(sav==p){
            while(q.size()&&q.back()-offset>=t) q.pop_back();
            q.push_back(t+offset);
        }else{
            ++offset;
            if(t!=p) ans=max(ans,(int)q.size()),q.push_front(p+offset);
        }
    }
    cout<<ans<<endl;
    return 0;
}

おすすめ

転載: www.cnblogs.com/winlere/p/12315458.html