题目:现在有n个数,其中有一些出现了一次,一些出现了两次,一些出现了很多次。现在要求你找出那些只出现一次的数,并按升序输出
这题n的范围是:1<= n <= 1000000
所以开普通数组无疑是会超空间的
STL中的bitset可以解决此题,声明两个1000000位的bitset变量:bitset<MAXN> b0, b1;
对于读入的数据做如下处理,当该数第一次出现时,将b0该位置1,当该数出现多余一次时,用b1标记相应位
则b0中为1的位并且b1中为0的位即是我们要的只出现一次的数
附:
bitset<100> bs 100表示bs有100位
bs.count() 表示二进制位为1的个数
bs.set() 把所有二进制位都置为1
bs.reset() 把所有二进制位都置为0
bs.to_ulong() 用同样的二进制位返回一个unsigned long值
bs[pos] 获取在pos处的二进制位
// jobdu 1402 特殊的数
#include <iostream>
#include <cstdio>
#include <bitset>
using namespace std;
#define FOR(i,a,b) for(i = (a); i < (b); ++i)
#define FORE(i,a,b) for(i = (a); i <= (b); ++i)
#define CLR(a,b) memset(a,b,sizeof(a))
const int MAXN = 1000002;
const int INF = 0x7f7f7f7f;
int x, n;
bitset<MAXN> b0, b1;
int main()
{
int i;
while(scanf("%d", &n) != EOF) {
b0.reset();
b1.reset();
int maxx = -1, minx = INF;
FOR(i, 0, n) {
scanf("%d", &x);
maxx = max(maxx, x);
minx = min(minx, x);
if(b0[x] == 0)
b0[x] = 1;
else
b1[x] = 1;
}
int len;
len = b0.count() - b1.count();
printf("%d\n", len);
bool sign = false;
FORE(i, minx, maxx)
if(b0[i] == 1 && b1[i] != 1) {
if(sign)
printf(" %d", i);
else {
printf("%d", i);
sign = true;
}
}
printf("\n");
}
return 0;
}