辞書的に生成された思想とPOJ 1146 IDコード順列

IDコード
制限時間: 1000ミリ秒   メモリの制限: 10000K
合計の提出: 7644   受け入れ: 4509

説明

それは2084年で、ビッグブラザーの年がようやく後半世紀はいえ、到着しました。市民をより細かく制御を行使することにより、法と秩序における慢性的な故障に対抗するために、政府は過激対策を決定 - すべての市民は、外科的に自分の左手首に移植小さなマイコンを持つことがあります。このコンピュータ意志は個人情報のすべての種類だけでなく、人の動きが記録され、中央コンピュータによって監視されるようになりますトランスミッタが含まれています。(この方法の望ましい副作用は、外科医のためのドールキューを短くすることです。)

各コンピュータの必須成分は、26の小文字から引き出された最大50個の文字から成る、固有の識別コードです。任意のコードの文字のセットが幾分偶然に選択されます。コードはチップに刻印されている複雑な方法は、文字の異なる選択して新しいコードを生成するよりも、他のコードの再配列されているコードを生成するために、メーカーがはるかに容易になります。それはセットを変更する前に使用されているから誘導したがって、一度文字の集合は、すべての可能なコードが選択されています。

例えば、コードが'Aの丁度3出現を含有することが決定されていると「' Bの2」及び'C」1は、その後、これらの条件下で、許容符号60の3つがあります。
      abaabc
 
abaacb
ababac

これら三つのコードはアルファベット順に上から下にリストされています。この文字セットで生成されたすべてのコードの中で、これらのコードは、この順に連続して表示されます。

これらの識別コードの発行を支援するプログラムを書きます。プログラムは、(繰り返し文字を含んでいてもよい)を超えない50の小文字の配列を受け入れ、与えられたコードは、のセットのシーケンスの最後である場合が存在するか、メッセージ`NO後継」場合後継コードを印刷します文字。

入力

入力は、コードを表す文字列を含む行毎の一連からなります。ファイル全体を単一の#からなる行で終了します。

出力

出力は、後継者のコードや単語「いいえ後継」を含む各コード読み取りのために1行で構成されます。

サンプル入力

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を" ); 
    } 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/cautx/p/11403927.html
おすすめ