読者です 読者をやめる 読者になる 読者になる

UVa11736 Debugging RAM

問題文
http://uva.onlinejudge.org/external/117/11736.html

大意
RAMに格納されている変数情報とRAMのメモリが与えられる。複数の変数名がクエリとして送られるので、10進数で変数の値を表示せよ。

解法
やるだけ。変数の持つバイト分の文字列を1ビットずつ読みながら値を決めていくが、読み込んだビットの値を加算する前に num <<= 1 などしてやると良い。コンテスト中は powl() 関数を使った。

反省
unsigned long long = uint64_t (stdint.h) で値を読む必要があった。コンテスト中に pow(double x, int y) 関数を使ってしまったところ、ちょうど最大ケースでオーバーフローしていた。powl(long double x, int y) で通すことが出来たが大量を出してしまった。

#include <bits/stdc++.h>
#include <stdint.h>

using namespace std;
 
int main() {
   
  int B, V;

  while(cin >> B >> V) {
    vector<string> s; vector<int> t;
    string ss; int tt;
     
    map<string, uint64_t> RAM;
     
    for(int i=0; i<V; i++) {
      cin >> ss >> tt;
      s.push_back(ss); t.push_back(tt);
    }
     
    for(int i=0; i<V; i++) {
      string data, d;
      for(int j=0; j<t[i]; j++) {
	cin >> d; data += d;
      }
      int const datasize = data.size();
      uint64_t num = 0;
      for(int ii=0; ii<datasize; ii++) {
	num <<= 1;
	num += (data[ii]-'0');
      }
      RAM[s[i]] = num;
    }
    
    
    int q; cin >> q; string svar;
    for(int i=0; i<q; i++) {
      cin >> svar;
      cout << svar << '=';
      if(RAM.find(svar) == RAM.end()) {}
      else { cout << RAM[svar]; }
      cout << endl;
    }
  }
   
  return 0;
}