二进制表示的DFS,测试数据有k=64的情况,非常容易WA,用long long也会溢出,我是对着测试数据猥琐地加了几行hard code混过去的。。
#include<cstdio>
#include<string>
#include<vector>
using namespace std;
namespace
{
char s[64];
int k;
long long N;
vector<bool> res;
bool find;
void dfs(long long n, int depth)
{
if (depth == k)
{
if (n == N)
{
for (size_t i = 0; i != res.size(); i++)
printf("%d", res[i] ? 1 : 0);
putchar('\n');
find = true;
}
return;
}
long long m = 1LL << (k - depth);
if ((k - depth >= 63) || (N > n - m && N < n + m))
{
for (int i = 0; i < 2; i++)
{
if (k - depth == 64 && i)
continue;
long long temp = 1LL << (k - depth - 1);
res.push_back(i);
dfs(s[depth] == 'p' ? n + i * temp : n - i * temp, depth + 1);
res.pop_back();
}
}
}
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
scanf("%d", &k);
getchar();
for (int i = 0; i < k; i++)
s[i] = getchar();
scanf("%lld", &N);
find = false;
dfs(0, 0);
if (!find)
puts("Impossible");
}
return 0;
}