SNOI2019文字列

件名の説明:

luogu

ソリューション:

この質問する$ O(n)と$。

まず、連続した同一の文字が一緒にしこり。

そのように、ビット率を前後にビットである辞書式比較を考慮してください。

ときに$ [I]> [I + 1] $、削除$ [i]は$一定の穿刺ドルより[J](J> I)$より良いです。

$ [I] <[I + 1] $、削除が$ [j]は、特定のパンクチャリング$ aより$ [i]は$より良いです。

その後、深い検索する$ O(n)と$です。

コード:

書式#include <cstdioを> 
する#include <CStringの> 
の#include <アルゴリズム>
 使用して 名前空間はstdを、
const  int型 N = 1000050 ;
char型[N]を。
INT B [N]、C [N]、N、M。
ボイド DFS(int型I)
{ 
    場合(I> M)のリターン;
    もし(C [i]が> C [I + 1 ])
    { 
        ためINT J = B [i]は、J <B [I + 1 ]; J ++)のprintf(" %dの" 、J)。
        DFS(I + 1 )。
    }
    { 
        DFS(I + 1 )。
        INT J = B [i]は、J <B [I + 1 ]; J ++)のprintf(" %dの" 、J)。
    } 
} 
int型のmain()
{ 
    scanf関数(" %D%S "、&​​N、A + 1 )。
    以下のためにint型 i = 1 ; iが<= N; iが++ 場合(![I] = [I- 1 ])
            B [ ++ M] = I、C [m]は= [I]。
    B [ ++ M] = N + 1 
    DFS(1 ); 
    プット("" );
    リターン 0 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/LiGuanlin1124/p/11130122.html