მოგესალმებით,
1) nika_k:
დაფორმატებული შეგიძლიათ ნახოთ აქ:
http://rafb.net/paste/results/W1843696.htmlint count_inscribed_rectangles(size_t m, size_t n) {
return m*n*(m+1)*(n+1)/4-1;
}
void generate_m(std::string const& input, std::string const& output) {
std::ifstream read(input.c_str(),std::ios::in);
std::ofstream write(output.c_str(),std::ios::out);
if (!read||!write) {
std::cerr << "IO failed." << std::endl;
}
int num_of_rects=0;
int sum_of_inscribed_rects=0;
std::vector<std::string> items;
std::string line;
// Discard the size of the square as it is superfluous.
if (!std::getline(read,line)) {
std::cerr << "Error" << std::endl;
exit(EXIT_FAILURE);
}
std::string::size_type prev=0,start_idx=0,end_idx=0;
typedef std::vector<std::string>::const_iterator const_iter;
while (std::getline(read,line)) items.push_back(line);
for (const_iter i=items.begin();i!=items.end();++i) {
while ((start_idx=i->find('1',prev))!=std::string::npos) {
end_idx=i->find('0',start_idx+1);
end_idx=(end_idx==std::string::npos)?line.size():end_idx;
prev=end_idx+1;
--end_idx;
// Check if rectangle is already counted.
if (i!=items.begin()&&(i-1)->operator[](start_idx)=='1'&&(i-1)->operator[](end_idx)=='1') {
if (start_idx>0&&end_idx<line.size()-1) {
if ((i-1)->operator[](start_idx-1)=='0'&&(i-1)->operator[](end_idx+1)=='0') continue;
} else if (start_idx>0) {
if ((i-1)->operator[](start_idx-1)=='0') continue;
} else if (end_idx<line.size()-1) {
if ((i-1)->operator[](end_idx+1)=='0') continue;
}
}
int n=end_idx-start_idx+1;
int m=1;
const_iter j=i;
while (++j<items.end()) {
if (j->operator[](start_idx)=='0'||j->operator[](end_idx)=='0') break;
if (start_idx>0&&end_idx<line.size()-1) {
if (j->operator[](start_idx-1)!='0'||(i-1)->operator[](end_idx+1)!='0') break;
} else if (start_idx>0) {
if (j->operator[](start_idx-1)!='0') break;
} else if (end_idx<line.size()-1) {
if (j->operator[](end_idx+1)!='0') break;
}
++m;
}
sum_of_inscribed_rects+=count_inscribed_rectangles(m,n);
++num_of_rects;
}
prev=0;
}
write << "A: " << num_of_rects << "\tB: " << sum_of_inscribed_rects << std::endl;
}
2) sony:
size_t count_bits(int n) {
size_t count=0;
while (n) {
n&=(n-1);
++count;
}
return count;
}
3) ACHRDILI:
დაფორმატებული შეგიძლიათ ნახოთ აქ:
http://rafb.net/paste/results/TR407696.htmlsize_t cycle_length(size_t n) {
size_t length=1;
while (n!=1) {
++length;
if ((n&1)==0) n>>=1;
else ++(n*=3);
}
return length;
}
void generate(std::string const& input, std::string const& output) {
std::ifstream read(input.c_str(),std::ios::in);
std::ofstream write(output.c_str(),std::ios::out);
if (!read||!write) {
std::cerr << "IO failed." << std::endl;
}
std::string line;
while (std::getline(read,line)) {
std::string::size_type index=line.find(' ');
if (index==std::string::npos) {
std::cerr << "Error" << std::endl;
exit(-1);
} else {
int i=atoi(line.substr(0,index).c_str());
int j=atoi(line.substr(index+1,line.size()-index-1).c_str());
int max_cycle=0;
int k=i;
while (k<=j) {
int cycle_len=cycle_length(k++);
max_cycle=(cycle_len>max_cycle)?cycle_len:max_cycle;
}
write << i << " " << j << " " << max_cycle << std::endl;
}
}
}
-D