日々精進

aikoと旅行とプログラミング

【AOJ 2700】Airport Codes

問題

Airport Codes | Aizu Online Judge

方針

  • 1文字目と母音の直後の文字を順に連結した文字列を作る.
  • k文字未満ならその文字列, k文字以上なら取り出した文字列の先頭からk文字分をコードとする.
  • kを1から50まですべて試す(試しても間に合う制約なので)

コード

#include <iostream>
#include <vector>
#include <map>

using namespace std;

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

string name[101];

bool isvowel(char c){
  return (c == 'a' || c == 'i' || c == 'u' || c == 'e' || c == 'o');
}

string getCode(string s, int k){
  string ans;
  ans = s[0];
  int len = s.size() - 1;
  REP(i, 0, len){
    if(isvowel(s[i])){
      ans += s[i+1];
    }
  }
  if((int)ans.size() < k) return ans;
  
  return ans.substr(0, k);
}

int check(int n){
  bool flag;
  
  REP(k, 1, 51){
    flag = true;
    map<string, bool> mp;
    rep(i, n){
      string s = getCode(name[i], k);
      if(mp.count(s) == 0){
        mp[s] = true;
      }else{
        flag = false;
        break;
      }
    }
    if(flag) return k;
  }
  return -1;
}

int main(){
  int n;

  while(cin >> n, n){
    rep(i, n){
      cin >> name[i];
    }
    int ret = check(n);
    cout << ret << endl;
  }
}