【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; } }