这样一来,问题就变得很简单了#include<bitset>
bitset<10> bt; // 开辟了有10个位的变量,即0000000000
bt.set(6); // 将第六位设为1,那么就变为0001000000
bt.set(1); // 将第1位设为1,那么就变为0001000010
bt.test(6); // 测试第六位是否为1,在这里返回1
bt.test(2); // 第二位是0,所以返回0
那么不用bitset呢,当然也能做。开个数组就行了。数组的每一个位置能存32个位,#include<iostream>
#include<bitset>
using namespace std;
bitset<12000000> bs;
int main()
{
char str[6];
int n, m;
while(~scanf("%d\n", &n))
{
for(int i = 1; i <= n; i++)
{
scanf("%s", str);
int len = strlen(str);
int num = 0;
for(int i = 0; i < len; i++)
num = num * 26 + str[i] - 'a';
bs.set(num);
}
scanf("%d\n", &m);
for(int i = 1; i <= m; i++)
{
scanf("%s", str);
int len = strlen(str);
int num = 0;
for(int i = 0; i < len; i++)
num = num * 26 + str[i] - 'a';
if(bs.test(num))
printf("yes\n");
else
printf("no\n");
}
}
return 0;
}
完整代码(实际运行时间比上面的bitset还要短,效果可真好!):x = Value / 32;
y = Value % 32;
也就是第X个数组位置的第y位。
赋值:hash[x] = hash[x] | (1 << y);
判断:if(hash[x] & (1 << y))
#include<iostream>
using namespace std;
int hash[380000];
int gethash(char *str)
{
int len = strlen(str);
int re = 0;
for(int i = 0; i < len; i++)
re = re * 26 + str[i] - 'a';
return re;
}
int main()
{
int n, m;
char str[6];
int num, x, y;
while(~scanf("%d\n", &n))
{
for(int i = 0; i < n; i++)
{
scanf("%s", str);
num = gethash(str);
x = num / 32;
y = num % 32;
hash[x] = hash[x] | (1 << y);
}
scanf("%d\n", &m);
for(int i = 0; i < m; i++)
{
scanf("%s", str);
num = gethash(str);
x = num / 32;
y = num % 32;
if(hash[x] & (1 << y))
printf("yes\n");
else
printf("no\n");
}
}
return 0;
}