質問の意味:
長さの文字列のn $(nは\当量1E6)$、(20文字)の文字から、一つの操作を行うことができ、一定期間は、すべての文字がサブストリングではない、操作の後に、文字列を逆に考えると部分文字列のための同じ最長の長さ。
問題解決のアイデア:
ほとんど圧力の面上に書かれた言葉のように20文字の代わりに26文字の合計。簡単には、タスクは、二つのサブ文字列、その長さと最大値を見つけることができませんされている同じ文字になり、その動作は一緒にスプライス反転させることにより任意の2つの隣接していないサブ文字列に対して、以下のことを確認してください。
$ DP [i]は$のために、それは文字0のエントリが存在しない状態で最長の部分文字列のすべての長さを表しています。= MAX(DP [I]、DP [I |(1 << J)])|したがって、伝達方程式を得るために$ DP [(1 << J)i]が可能です$、そして最終的には、ちょうど私を列挙し、プラス$ DPに[(1 << 20)-1-それは] $の最大を撮影することができます。
そして最後にコードを貼り付け
#include <ビット/ STDC ++ H> 使用して名前空間STDを、 typedefの長い長いLL。 typedefの長いダブルLD; 符号なしのtypedef 長い長いULL。 ペアのtypedef < int型、int型 > PII。 #define担当者(I、x、y)は(INT I =(x)は、I <(Y); I ++)のため の#define REPT(I、x、y)のための(INT I =(x)は、I <=( y)は、I ++) の#define I> = Y; i--)(int型I = xの(I、X、Yあたり) の#define PB一back の#define MP make_pair の#define Fiの第一 の#define SE第二 の#define ド(X)COUT << #X << "= "<< X << ENDL の#define DD(X)COUT << #X <<"= "<< X <<"" の#define MES(B )のmemset(A、B、はsizeof A) のconst int型 INF = 0x3f3f3f3f 。 文字列sの。 INT DP [ 1 << 20 ]。 int型のmain() { IOS :: sync_with_stdio(偽); cin.tie(0 )。 MES(DP、0 ); cinを >> 秒; INT LEN = s.size()。 担当者(I、0 、 ; 担当者(J、I、LEN) { 場合(ヴァル&(1 <<(S [J] - ' ' ))) { // DD(I)、デ(J)。// DD(ヴァル);デ((1 <<(S [J] - ''))); 休憩; } ヴァル | =(1 <<(S [J] - ' ' )); DP [ヴァル] = J-I + 1 。 } } 担当者(I、0、(1 << 20 )) のrep(j、0、20 ) { もし(I&(1 << J))続けます。 DP [I |(1 << J)] = MAX(DP [I]、DP [I |(1 << J)]); } INT ANS = 0 。 担当者(I、0、(1 << 20 )) { ANS = MAX(ANS、DP [I] + DP [((1 << 20) - 1)^ I])。 } COUT << ANS << " \ n " 。 リターン 0 ; }