羅区P1808 _NOIワード分類ガイド2011増加(01)は、文字列のソート

羅区P1808 _NOI単語分類ガイド2011増加(01)

タイトル説明

オリバーは、背中の痛み、英語の単語を学ぶことにしましたが、すぐに彼は混乱した単語が直接、彼は言葉を分類することを決定し、覚えておくことは非常に困難である見つけました。

二つの単語は、クラスに分けることができるかどうか、および各2つの文字からなる単語の数が同じである場合のみ。

たとえば、「AABAC」、そしてそれを「CBAAAは」クラスに分類することができ、一方では「AAABBは」クラスではありません。

大文字ですべての単語は、各単語の長さは100を超えていないオリバーは今、Nワードがあります。オリバーは、これらの言葉は、いくつかのカテゴリに分類され、あなたを指示します。

入力形式

ワードNの入力ファイル数、各行動のN本のワード線の最初の行。

出力フォーマット

出力ファイルは、カテゴリにNワードの数を表す数だけを、含まれています

サンプル入力と出力

入力#1

AABAC  
CBAAA  
AAABB
出力#1
2

説明/ヒント

データの70%をN≤100を満たします。データの100%にN≤10000を満たします。

溶液

アルゴリズム(1)

各ソート文字列自体の内部

そして、ソートすべての文字列

初期ANS = 1;のうちの少なくとも一種が存在することになるので

すべての文字列を列挙し、strの場合は[i]が!=筋力[I + 1]、ANS ++。

最後に、出力ANS

操作の最大数:

100 *ログ(100)* 10000 + 10000 *ログ(10000)+10000

約O(nlog(n))がに等しく、右?

Code(100分)

事実、これはに住むことができることを証明しています

それは背後に、より複雑なアルゴリズムを必要としません。

。1つの#include <iostreamの> // 雲台を使用していない、仕事のOIを取得する必要はありません
2の#include <アルゴリズム> // 迅速ドレインソート()
3。の#include <CStringの>
 4。 使用して 名前空間STD;
 。5  BOOLの cmpchar(文字 TA、CHAR TB){
 6。     復帰 TA < TB;
 7  }
 。8  BOOLの cmpstr(文字 TA、TB){
 9。     復帰 TA < TB;
 10  }
 11  文字単語[ 10001 ];
 12れます int型のn;
13  のint main()の
 14  {
 15      CIN >> N。
16      INT ANS = 1 17      のためにint型 I = 0 ; iがn <I ++は{)
 18          CIN >> ワード[i]は、
19          ソート(&ワード[I] [ 0 ]、&ワード[I] [単語[I] .size()]、cmpchar)。
20      }
 21      ソート(&ワード[ 0 ]、&ワード[n]は、cmpstr)。
22      のためにint型 I = 0 ; iがN- < 1 ; iが++ 23      であれば(!ワード[I] =ワード[I + 1 ])
 24の          ANS ++ 25      COUT << ANS。
26      リターン 0 ;
27 }

分類間隔を見つけ、クラス間隔の数= 1:アイデアはこれです

アルゴリズム(2)

借入STL <マップ>

マップは、それはカスタム配列として扱うことができ、

マップ<文字列、ブール>単語

これは、新しい配列を作成することです

呼ばれる単語

次の表は、文字列型であります

bool値は型であります

そして、それは、アレイへの直接アクセスと同じくらい普通のことができます

ワード[STR] == 1。

Code(100分)

。1つの#include <iostreamのは> // 雲台を使用していない、仕事のOIを取得する必要はありません
2の#include <アルゴリズム> // 迅速ドレインソート()
。3の#include <CStringの>
 。4の#include <cstdioを>
 。5の#include <地図> 
 。6  使用して 名前空間STD;
 7地図< 文字列BOOL > 単語;
 8  int型N-、ANS;
 9  ストリングT;
 10  intは(メイン)
 11  {
 12は      scanfの(" %のD "、およびN-);
 13である     ためint型 i = 0 ; iがN <; Iは++ 14      {
 15          CIN >> T。
16          ソート(t.begin()、t.end())。
17          であれば(!ワード[T])
 18          {
 19の              ANS ++ 20              ワード[T] = 1 21          }
 22      }
 23      COUT << ANS。
24      リターン 0 ;
25 }

ハッハッハ、ソートよと、このようにとどまることができます!

str.begin()str.end()はアドレスをエンドツーエンドSTR戻ります

この比率

ソート(&ワード[I] [0]、&ワード[I] [単語[I] .size()]、cmpchar)。

使用する方が簡単で、右?

STL大法が良いです!

おすすめ

転載: www.cnblogs.com/send-off-a-friend/p/11334325.html