最短プレフィックス
説明:
プレフィックス文字列は、サブ文字列の開始の最初の文字の文字列です。「C」、「CA」:例えば「炭素」の文字列で 、「車」、「炭水化物」、「炭」、 および「カーボン」。ここで私たちは空の文字列が文字列であるとは思わないが、各非空の文字列が文字列そのものであることに注意してください。私たちは今、単語の接頭辞サムネイル表現を使用することを願っています。たとえば、「炭水化物」は、通常省略されますが、単語の集合を与えられている。「炭水化物」を表現し、独自に各単語を識別最短プレフィックスを見つけるように頼む
以下の例では、「炭水化物」「carboh」と略すことができそれは「炭」開始と単語有する限り、それは「炭」(または残り短いプレフィックス)と略すことができない
一致が正確に前方一致を上書きし、例えば、接頭辞「車」の正確な一致の単語「車」を。したがって、「車」は「車は」略語は、「車」、「車」は始まっする「キャリッジ」またはリスト内の任意の単語として扱われることはありませんあいまいではないです。
入力
入力は1000行まで、少なくとも2つの行を含む。各行は最大で20小文字のワード、少なくとも1つのワード長を含みます。
出力
同じ行数の行出力と入力。入力のそれぞれの行の先頭からの出力ワードの各ラインは、接頭識別子最短曖昧さなしに対応するワードに続くスペースが続きます。
サンプル入力
炭水化物 カート キャブレター カラメル カリブー 炭酸 軟骨 炭素 キャリッジ カートン 車 カーボネート
サンプル出力
炭水化物carboh カートカート キャブレターcarbu キャラメル親愛 カリブー親愛なる 炭酸炭素 軟骨はがき カーボンカーボン 保護のGet カートンCARTO 車の 炭酸、炭酸
トピックリンク:
https://vjudge.net/problem/OpenJ_Bailian-2797
この問題は、貪欲カテゴリ別ですが、今、私は本当に暴力的な列挙を書くとき、単純に時間を忘れて、直接に、十分なはずです。
、コードの最初の単語は、文字列を取る前に、最初の二つの文字列、最初の文字列......と他の三つの言葉を比較することができることを唱え比較、特定の操作を避ける方法
ACコード
書式#include <iostreamの> の#include <cstdioを> する#include <fstreamの> の#include <アルゴリズム> 書式#include <cmath> の#include <両端キュー> の#include <ベクトル> の#include <キュー> の#include < 文字列 > の#include <CStringの> 書式#include <マップ> 書式#include <スタック> の#include < 設定 > 書式#include <sstream提供> #define MOD 1000000007件 の#define EPS 1E-6 の#defineっ長い長い の#define INF 0x3f3f3f3f #define ME0(X)のmemset(X、0、はsizeof(x))を 使用して 名前空間STD; ストリング S [ 1005 ]; int型のmain() { int型 N- = 0 ; 一方(CIN >> S [N - ++])。// 完了プレス後に入力し、 "CTRL + Z"を入力し、Enterキーを押し // (INT I = 1; I <= N; I ++)のため // COUT << S [I] < <ENDL; のための(INT I = 1 ; I <= N - 、Iは++)// 文字列配列が始まるから 、{ ため(INT J = 1。 ; J <=のS [I] .size(); + J +)// S [i]が1から長さが最大長さであります { // 指定された位置に必要SUBSTR列レプリコン機能、および指定された長さを有する // SUBSTRを(指定位置、指定された長さ) のString [I] .SUBSTR(SS = S 0 、J); int型フラグに= 1 ; のための(int型 K = 1 ; K <= N; K ++)//は、文字列の配列の1つの比較から始まる { IF!(K = Iは、S && [K] .SUBSTR(0、J) SS ==)// 接頭文字列配列、他方が等しい場合、故障 { フラグに = 0 ; BREAK ; } } IF(フラグ|| jは== S [I] .size())// 满足条件输出 { COUT << S [I] << " " << SS << ENDL。 破ります; } } } }