件名の説明:
ソリューション:
この質問する$ 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 ; }