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