Entries

スポンサーサイト (この記事を編集する[管理者用])

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://rsujskf.blog32.fc2.com/tb.php/1883-50f96e44
この記事にトラックバックする(FC2ブログユーザー)

SRM496 DIV2 EASY - AnagramFree (この記事を編集する[管理者用])

Source

TopCoder SRM496 DIV2 EASY (250pt)
Problem Statement

問題概要

50文字以下のアルファベット小文字のみからなる文字列がN個 (50以下) 与えられる.
それらから,いくつかの文字列を選び,選んだ文字列のどのペアもアナグラムの関係になっていないようにしたい.
最大で何個の文字列を選べるか求める問題.
2つの文字列がアナグラムの関係,とは,それぞれの文字を並び替えることで一致させることができること.

解法

要するに,それぞれの文字列の,それぞれの文字の文字数を全部数えて,それらが異なっているものが何種類あるかという問題.
以下のコードでは,それぞれの文字が何個あるかをvector<int>にいれて,それをsetに突っ込んで,最終的なsetの要素数を返した.
それぞれの文字数を数えずに,それぞれの文字列をソート (abdac→aabcd) して,setに突っ込むというのが一番楽かも.

C++によるスパゲッティなソースコード
// #includeとusing namespace std;は略

#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)

class AnagramFree {
public:
int getMaximumSubset(vector <string> S) {
  int i,j,k;
  set<vector<int> > s;

  rep(i,S.size()){
    vector<int> add(26);
    rep(k,S[i].size()) add[S[i][k]-'a']++;
    s.insert(add);
  }

  return s.size();
}

};

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://rsujskf.blog32.fc2.com/tb.php/1883-50f96e44
この記事にトラックバックする(FC2ブログユーザー)

Appendix

Recent Articles

ブログ内検索

Ads


(プライバシーポリシー)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。