JZOJ5399. 【NOIP2017提高A组模拟10.7】Confess bitset

来源:互联网 发布:java file.getname 编辑:程序博客网 时间:2024/05/16 08:45

Description

小w 隐藏的心绪已经难以再隐藏下去了。
小w 有n + 1(保证n 为偶数) 个心绪,每个都包含了[1,2n] 的一个大小为n 的子集。
现在他要找到隐藏的任意两个心绪,使得他们的交大于等于n/2 。

Input

一行一个整数n。
接下来每行一个长度为k 的字符串,该字符串是一个64 进制表示,ASCII 码为x 的字符代表着x-33,所有字符在33 到33 + 63之间。
转为二进制表示有6k位,它的前2n个字符就是读入的集合,第i 位为1 表示这个集合包含i,为0表示不包含。

Output

一行两个不同的整数表示两个集合的编号。
如果无解输出”NO Solution”。

Sample Input

10
EVK#
IH=#
676”
R7,#
74S”
6V2#
O3J#
S-7NU5C[$
3N.#

Sample Output

1 2

Data Constraint

对于20% 的数据满足n <= 100。
对于50% 的数据满足n <= 1 *10^3。
对于100% 的数据满足n <= 6 * 10^3。

啊,自作自受,不认真学bitset的后果。
bitset裸题,把字符串加进bitset里面,用自带函数直接求就可以了= =。

#include<cstdio>#include<algorithm>#include<cstring>#include<bitset>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int N=1e5+5;char s[N];bitset<12005> b[6005];int n,l,now,f[N],bin[20],x;int main(){    freopen("confess.in","r",stdin);    freopen("confess.out","w",stdout);    scanf("%d",&n);    bin[0]=1;    fo(i,1,5)bin[i]=bin[i-1]*2;    fo(i,1,n+1)    {        scanf("%s",&s);        l=strlen(s);        now=2*n;        fo(j,0,l-1)        {            x=s[j]-33;            fd(k,5,0)            {                now--;                if ((x&bin[k])>0)b[i].set(now);                if (!now)break;            }            if (!now)break;        }        f[i]=b[i].count();    }    fo(i,1,n-1)    {        fo(j,i+1,n)        {            b[6003]=b[i] xor b[j];            int x=b[6003].count();            if (f[i]+f[j]-x>=n)            {                printf("%d %d",i,j);                return 0;            }        }    }    printf("NO Solution\n");    return 0;}
阅读全文
0 0
原创粉丝点击