制限時間: 1000ミリ秒 | メモリの制限: 10000K | |
合計の提出: 7644 | 受け入れ: 4509 |
説明
各コンピュータの必須成分は、26の小文字から引き出された最大50個の文字から成る、固有の識別コードです。任意のコードの文字のセットが幾分偶然に選択されます。コードはチップに刻印されている複雑な方法は、文字の異なる選択して新しいコードを生成するよりも、他のコードの再配列されているコードを生成するために、メーカーがはるかに容易になります。それはセットを変更する前に使用されているから誘導したがって、一度文字の集合は、すべての可能なコードが選択されています。
例えば、コードが'Aの丁度3出現を含有することが決定されていると「' Bの2」及び'C」1は、その後、これらの条件下で、許容符号60の3つがあります。
abaabc
abaacb
ababac
これら三つのコードはアルファベット順に上から下にリストされています。この文字セットで生成されたすべてのコードの中で、これらのコードは、この順に連続して表示されます。
これらの識別コードの発行を支援するプログラムを書きます。プログラムは、(繰り返し文字を含んでいてもよい)を超えない50の小文字の配列を受け入れ、与えられたコードは、のセットのシーケンスの最後である場合が存在するか、メッセージ`NO後継」場合後継コードを印刷します文字。
入力
出力
サンプル入力
abaacb cbbaa #
サンプル出力
ababac ませ後継
質問の意味:
開発者は、文字の位置を交換することによって、新しい文字列を作成し、これらの文字列を彫刻のコストを節約するために来ているので最初は、現在に聞いて、すべての可能なすべての順列を見つけるために今、辞書式順序付けを想定し、文字列を設定しますそれは、(辞書式順序で)指定された配列の次の文字列は何ですか?、想定識別コード三、2つのBを有し、例えば、60コード配列の条件でCは、辞書によって選択された3次のとおりabaabc、abaacb、ababacは、今与えられた文字列の主題は、次いで、abaacbあります辞書式順序が関係している、次の文字列がababac、出力「ababac」缶です。
分析:
この問題は、辞書的に文字列を変換するために考えを利用し、それは辞書式順序の文字の文字列の場合に生成された(出力なし「いいえ後継」)を変更せずに、です。
ソリューション:
正シーケンスを見つけるために戻ってから1。(私は言葉を見つけることができないん後継ではありません)。
2.正のシーケンス(ID)の指数バックトラバース及び最後の要素は、S [ID-1]以下であることが判明することを見つけるために先頭から(正の配列の添字は、IDがID-1であることに注意)であります(添え字jと呼ばれます)。
3.swap(S [ID-1]、S [J]);元の正のシーケンスを破壊するために2つの数値を入れ替えるだけでなく、辞書新しい順に見られる要素はS未満であるので、[ID-1]を交換後の辞書小さい特定。
4.sort(S + ID、+ LENをS);小の終わりまでIDからすべての要素大きいために我々の新しい結果は、この文字列を辞書式順序で得られることを確実にするには、元の文字列の後にあります。
ACコード:
書式#include <cstdioを> する#include <CStringの> の#include <アルゴリズム> 使用して 名前空間はstdを、 チャー S [ 55 ]。 INT 解く() { int型 LEN = STRLEN(S)。 INTの ID = len- 1 。 一方、(ID> = 0 ) { もし、(S [ID]> S [ID- 1 ]) ブレーク。 他 { ID - 。 } } もし(ID == 0) リターン 0 ; INT MPRE = ID- 1、mnow = ID。 用(int型 J = mnow + 1、J <LEN; J ++ ) { もし、(S [j] <= S [MPRE]) 続けます。 もし(S [J] <S [mnow])mnow = J。 } スワップ(S [mnow]、[MPRE] S)。 ソート(S + IDは、+ S LEN)。 リターン 1 ; } int型のmain() { // freopenは( "INPUT.TXT"、 "R"、STDIN)。 しばらく(〜のscanf(" %sを"、S)&& S [ 0 ]!=' #' ) { 場合(解決())のprintf(" %sのを\ n " 、S); 他のprintf(" ノー後継\ nを" ); } }