```cpp
#include <bits/stdc++.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/mman.h>
int n, m;
char op[200000];
int t[200000];
int calculate(int start, int mask)
{
for (int i = 0; i < n; i++)
{
switch (op[i])
{
case 'A':
start &= t[i];
break;
case 'O':
start |= t[i];
break;
case 'X':
start ^= t[i];
break;
default:
break;
}
}
return start & mask;
}
char *input;
char *end;
void read_data()
{
while (*input != ' ')
{
n *= 10;
n += *input - '0';
input++;
}
input++;
while (*input != '\n')
{
m *= 10;
m += *input - '0';
input++;
}
input++;
for (int i = 0; i < n; i++)
{
op[i] = *input;
while (*input != ' ')
input++;
input++;
while (*input != '\n')
{
t[i] *= 10;
t[i] += *input - '0';
input++;
}
input++;
}
// op[n - 1] = *input;
// while (*input != ' ')
// input++;
// input++;
// while (input != end)
// {
// t[n - 1] *= 10;
// t[n - 1] += *input - '0';
// input++;
// }
// input++;
}
int main()
{
int fd = open64("/dev/stdin", O_RDONLY);
struct stat64 buf;
uint64_t length = fstat64(fd, &buf);
input = (char *)mmap64(NULL, buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
close(fd);
end = input + buf.st_size;
read_data();
int ans = 0;
int my_ans = 0;
int i = 1;
for (; true; i++)
{
int base = 1 << i - 1;
int false_value = calculate(0, base);
int true_value = calculate(base, base);
if (false_value < true_value)
{
my_ans += base;
if (my_ans > m)
break;
ans += true_value;
}
else
{
ans += false_value;
if (i - 1 > std::__lg(m))
break;
}
}
while (i <= 31)
{
i++;
ans += calculate(0, 1 << i - 1);
}
printf("%d", ans);
munmap(input, buf.st_size);
return 0;
}
```
这是把最后一个字符当成换行符的代码,实测反而AC了
by yiming564 @ 2023-11-22 23:26:59
@[yiming564](/user/554746) 很久很久以前约定俗称地使每个文件的结尾必须是换行。后来操作系统都变聪明了,所以无所谓了。
当然文件尾加上换行不失为一个好习惯。
by Eznibuil @ 2023-11-22 23:32:28