SRM 391 250pt: IsomorphicWords

問題概要

文字列がN(<50)個与えられる。文字の置換で同型になるペアが何通りあるか求める問題。

考えたこと

  • 色々やり方がありそう。
  • 数字に変換して比較するか。
  • 一番愚直な方法で書く。余計なことはしない。
  • 問題なく通った。

practiceで通ったコード

計算量O(N^2 * L)

#include <vector>
#include <string>
using namespace std;

struct IsomorphicWords {

	int countPairs(vector <string> words) {
		const int N = words.size();

		//vector<int>に変換
		vector< vector<int> > vs(N);
		for(int i=0; i<N; i++){
			vs[i].assign(words[i].length(), 0);
			int cnt = 1;
			for(int j=0; j<(int)vs[i].size(); j++)if(vs[i][j] == 0){
				char ch = words[i][j];
				for(int k=0; k<(int)words[i].length(); k++){
					if(words[i][k] == ch){
						vs[i][k] = cnt;
					}
				}
				cnt++;
			}
		}

		int ret = 0;
		for(int i=0; i<N; i++){
			for(int j=i+1; j<N; j++){
				if(vs[i] == vs[j]){
					ret++;
				}
			}
		}
		return ret;
	}

};