# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
931092 | boris_mihov | Ancient Machine (JOI21_ancient_machine) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "Anna.h"
#include <algorithm>
#include <iostream>
#include <cassert>
#include <vector>
typedef long long llong;
const int BUCKET_SIZE = 73;
const int MYLOG = 51;
llong fib[BUCKET_SIZE + 5];
struct FibbonacciConverter
{
std::string getString(std::string s)
{
while (s.size() % BUCKET_SIZE != 0)
{
s += '0';
}
std::string res;
for (int i = 0 ; i < s.size() ; i += BUCKET_SIZE)
{
llong currNum = 0;
for (int j = i ; j < i + BUCKET_SIZE ; ++j)
{
if (s[j] == '1') currNum += fib[j - i];
}
assert(currNum < (1LL << MYLOG));
for (int log = MYLOG - 1 ; log >= 0 ; --log)
{
if (currNum & (1LL << log))
{
res += '1';
} else
{
res += '0';
}
}
}
return res;
}
std::string fromString(std::string s)
{
assert(s.size() % MYLOG == 0);
std::string res;
for (int i = 0 ; i < s.size() ; i += MYLOG)
{
llong currNum = 0;
for (int j = i ; j < i + MYLOG ; ++j)
{
currNum *= 2;
if (s[j])
{
currNum++;
}
}
std::string toAdd;
for (int pos = BUCKET_SIZE ; pos > 0 ; --pos)
{
if (currNum >= fib[pos - 1])
{
toAdd += '1';
currNum -= fib[pos - 1];
} else
{
toAdd += '0';
}
}
std::reverse(toAdd.begin(), toAdd.end());
res += toAdd;
}
return res;
}
};
void Anna(int N, std::vector <char> s)
{
fib[0] = 1;
fib[1] = 2;
for (int i = 2 ; i < BUCKET_SIZE + 5 ; ++i)
{
fib[i] = fib[i - 1] + fib[i - 2];
}
bool foundX = false;
std::string toConvert;
for (int i = 0 ; i < N ; ++i)
{
if (!foundX && s[i] == 'X')
{
foundX = true;
// toConvert += '1';
Send(1);
i++;
} else if (foundX && s[i] == 'Z')
{
Send(1);
i++;
} else
{
Send(0);
}
}
}
#include "Anna.h"
#include <algorithm>
#include <iostream>
#include <cassert>
#include <vector>
typedef long long llong;
const int BUCKET_SIZE = 73;
const int MYLOG = 51;
llong fib[BUCKET_SIZE + 5];
struct FibbonacciConverter
{
std::string getString(std::string s)
{
while (s.size() % BUCKET_SIZE != 0)
{
s += '0';
}
std::string res;
for (int i = 0 ; i < s.size() ; i += BUCKET_SIZE)
{
llong currNum = 0;
for (int j = i ; j < i + BUCKET_SIZE ; ++j)
{
if (s[j] == '1') currNum += fib[j - i];
}
assert(currNum < (1LL << MYLOG));
for (int log = MYLOG - 1 ; log >= 0 ; --log)
{
if (currNum & (1LL << log))
{
res += '1';
} else
{
res += '0';
}
}
}
return res;
}
std::string fromString(std::string s)
{
assert(s.size() % MYLOG == 0);
std::string res;
for (int i = 0 ; i < s.size() ; i += MYLOG)
{
llong currNum = 0;
for (int j = i ; j < i + MYLOG ; ++j)
{
currNum *= 2;
if (s[j])
{
currNum++;
}
}
std::string toAdd;
for (int pos = BUCKET_SIZE ; pos > 0 ; --pos)
{
if (currNum >= fib[pos - 1])
{
toAdd += '1';
currNum -= fib[pos - 1];
} else
{
toAdd += '0';
}
}
std::reverse(toAdd.begin(), toAdd.end());
res += toAdd;
}
return res;
}
};
void Anna(int N, std::vector <char> s)
{
fib[0] = 1;
fib[1] = 2;
for (int i = 2 ; i < BUCKET_SIZE + 5 ; ++i)
{
fib[i] = fib[i - 1] + fib[i - 2];
}
bool foundX = false;
std::string toConvert;
for (int i = 0 ; i < N ; ++i)
{
if (!foundX && s[i] == 'X')
{
foundX = true;
// toConvert += '1';
Send(1);
i++;
} else if (foundX && s[i] == 'Z')
{
Send(1);
i++;
} else
{
Send(0);
}
}
}