Ranking (as of 2013-06-09): 874 out of 2256
Language: C++
/*
UVa 644 - Immediate Decodability
To build using Visual Studio 2008:
cl -EHsc -O2 immediate_decodability.cpp
*/
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
struct symbol
{
int length_;
int code_;
symbol() : length_(-1), code_(0) {}
symbol(int length, int code) : length_(length), code_(code) {}
bool operator<(const symbol& s) const {return length_ < s.length_;}
};
bool is_immediate_decodable(int n, const symbol symbols[])
{
int masks[] = {0x0000, 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f,
0x00ff, 0x01ff, 0x03ff};
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++) {
int diff = symbols[i].code_ ^ symbols[j].code_;
if (!(diff & masks[symbols[i].length_]))
return false;
}
return true;
}
int main()
{
const int nr_symbols_max = 8;
string bc;
for (int g = 1; cin >> bc; g++) {
int nr_symbols = 0;
symbol symbols[nr_symbols_max];
do {
int length = bc.length(), code = 0;
for (int i = 0, b = 1; i < length; i++, b <<= 1)
if (bc[i] == '1')
code |= b;
symbols[nr_symbols++] = symbol(length, code);
cin >> bc;
} while (bc != "9");
sort(symbols, symbols + nr_symbols);
cout << "Set " << g <<
((is_immediate_decodable(nr_symbols, symbols)) ?
" is immediately decodable\n" : " is not immediately decodable\n");
}
return 0;
}
No comments:
Post a Comment