题目
段错误代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int son[N][2], cnt[N], idx;
char num[N][33];
void binary(char* str, int a)
{
int p = 31;
while(a)
{
int bit;
if(a & 1) bit = 1;
else bit = 0;
str[p--] = (char)(bit + '0');
a >>= 1;
}
}
void insert(char str[])
{
int p = 0;
for(int i = 0; str[i]; i++)
{
int u = str[i] - '0';
if(!son[p][u]) son[p][u] = ++idx;
p = son[p][u];
}
cnt[p]++;
}
int main()
{
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
int m;
memset(num[i], '0', (sizeof num[i]) - 1);
num[i][32] = '\0';
scanf("%d", &m);
binary(num[i], m);
insert(num[i]);
}
int res = 0;
for(int i = 1; i <= n; i++)
{
int this_time = 0, p = 0;
for(int j = 0; num[i][j] != '\0'; j++)
{
int u = num[i][j] - '0';
int v = u ^ 1;
if(son[p][v])
{
this_time = this_time * 2 + 1;
p = son[p][v];
}
else
{
this_time *= 2;
p = son[p][u];
}
}
res = max(res, this_time);
}
cout << res;
return 0;
}
原因
1e5是数字的数目,但是我们是以bit为单位存的,32*1e5<4e6
正确代码
#include<bits/stdc++.h>
using namespace std;
const int N = 4e6+10;
int son[N][2], cnt[N], idx;
char num[N][33];
void binary(char* str, int a)
{
int p = 31;
while(a)
{
int bit;
if(a & 1) bit = 1;
else bit = 0;
str[p--] = (char)(bit + '0');
a >>= 1;
}
}
void insert(char str[])
{
int p = 0;
for(int i = 0; str[i]; i++)
{
int u = str[i] - '0';
if(!son[p][u]) son[p][u] = ++idx;
p = son[p][u];
}
cnt[p]++;
}
int main()
{
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
int m;
memset(num[i], '0', (sizeof num[i]) - 1);
num[i][32] = '\0';
scanf("%d", &m);
binary(num[i], m);
insert(num[i]);
}
int res = 0;
for(int i = 1; i <= n; i++)
{
int this_time = 0, p = 0;
for(int j = 0; num[i][j] != '\0'; j++)
{
int u = num[i][j] - '0';
int v = u ^ 1;
if(son[p][v])
{
this_time = this_time * 2 + 1;
p = son[p][v];
}
else
{
this_time *= 2;
p = son[p][u];
}
}
res = max(res, this_time);
}
cout << res;
return 0;
}