解いた問題

6/10/2011

SRM344Div2

250
string itoa(int n)
{
  ostringstream oss;
  oss << n;
  return oss.str();
}

class Chessboard {
public:
  string changeNotation(string cell) {
    map<string, string> conv;
    int cnt = 0;
    for(char n='1'; n<='8'; ++n){
      for(char c='a'; c<='h'; ++c){
    string s;
    string t = itoa(++cnt);
        s += c;
        s += n;
        conv[s] = t;
    conv[t] = s;
      }
    }
    return conv[cell];
  }
};
500
int conv(char c)
{
  if( c == ' ' )return 0;
  return c - 'a' + 1;
}

char rev(int n)
{
  if( n == 0 )return ' ';
  return 'a' + n - 1;
}

string solve(string s, string p)
{
  string t;
  for(int i=0; i<s.size(); ++i){
    int n = conv( s[i] ) + conv( p[i%3] );
    t += rev( (n + 27) % 27 );
  }
  return t;
}

bool valid(string s)
{
  istringstream iss(s);
  string t;
  int sum = 0;
  while( iss >> t ){
    if( t.size() == 1 || 8 < t.size() )return false;
    if( sum ) ++sum;
    sum += t.size();
    bool flg = false;
    for(int i=0; i<t.size(); ++i){
      if( t[i] == 'a' || t[i] == 'i' || t[i] == 'u' || t[i] == 'e' || t[i] == 'o' ){
        flg = true;
        break;
      }
    }
    if( !flg )return false;
  }
  return sum == s.size();
}

class SimpleRotationDecoder {
public:
  string decode(string text) {

    for(char a='a'; a<='z'; ++a){
      for(char b='a'; b<='z'; ++b){
        for(char c='a'; c<='z'; ++c){
          string s = "";
          s += a;
          s += b;
          s += c;
          string t = solve(text, s);
          if( valid(t) )return t;
        }
      }
    }

    return "";
  }
};
1000
class QuantumAlchemy {
public:
  int minSteps(string ini, vector <string> rea) {

    map<char, int> elem;
    for(int i=0; i<ini.size(); ++i){
      ++elem[ ini[i] ];
    }

    map<char, string> mat;
    for(int i=0; i<rea.size(); ++i){
      string s = rea[i];
      reverse( s.begin(), s.end() );
      char c = s[0];
      string t = s.substr( 3 );
      mat[ c ] = t;
    }

    map<char, int> needed;
    int ret = 0;
    needed['X'] = 1;
    while( ret < 10000 ){
      for(char c='A'; c<='Z'; ++c){
        if( needed[c] > elem[c] && mat.find(c) == mat.end() ){
          return -1;
        }
      }
      bool flg = true;
      for(char c='A'; c<='Z'; ++c){
        if( needed[c] > elem[c] ){
          ++ret;
          string s = mat[c];
          --needed[c];
          for(int i=0; i<s.size(); ++i){
            ++needed[ s[i] ];
          }
          flg = false;
          break;
        }
      }
      if( flg ) return ret;
    }

    return -1;
  }
};

0 件のコメント :

コメントを投稿