题解:其实一开始想的很复杂,连树状数组都想过用上,但是后来发现貌似也就15种病,这样子就容易了——直接进行01状态压缩,然后枚举各种状态(HansBug:实际上,对于疾病的状态只需要保留刚刚好K种病即可,就算是更少的病种也可以剪掉,想想为什么^_^),然后就是各种位运算,然后A掉么么哒
1 /**************************************************************
2 Problem: 1688
3 User: HansBug
4 Language: Pascal
5 Result: Accepted
6 Time:80 ms
7 Memory:4132 kb
8 ****************************************************************/
9
10 var
11 i,j,k,l,m,n,x,ans:longint;
12 a:array[0..1000000] of longint;
13 function min(x,y:longint):longint;
14 begin
15 if x<y then min:=x else min:=y;
16 end;
17 function max(x,y:longint):longint;
18 begin
19 if x>y then max:=x else max:=y;
20 end;
21 begin
22 readln(n,m,l);l:=min(l,m);ans:=0;
23 for i:=1 to n do
24 begin
25 a[i]:=0;
26 read(k);
27 for j:=1 to k do
28 begin
29 read(x);
30 a[i]:=a[i] or (1 shl (x-1));
31 end;
32 readln;
33 end;
34 for i:=0 to trunc(exp(ln(2)*m)-1) do
35 begin
36 j:=i;k:=0;
37 while j>0 do
38 begin
39 inc(k,j mod 2);
40 j:=j div 2;
41 end;
42 if k<>l then continue;k:=0;
43 for j:=1 to n do if (i or a[j])=i then inc(k);
44 ans:=max(ans,k);
45 end;
46 writeln(ans);
47 end.