Home

ACMICPC Team

Detailed explanation coming soon!

import java.util.*;
import java.io.*;

public class Solution {
    public static void main(String[] args){
        try{
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st = new StringTokenizer(in.readLine(), " ");
            int n = Integer.parseInt(st.nextToken());
            int m = Integer.parseInt(st.nextToken());
           
            BitSet[] list = new BitSet[n];
            
            for(int i = 0; i < list.length; i++){
                list[i] = new BitSet(m);
                for(int j = 0; j < m; j++){
                    boolean isWellVersed = (in.read() == '0') ? false : true;
                    list[i].set(j, isWellVersed);
                }
                in.read(); //newline
            }
            
            int maxTopics = 0;
            int eligibleTeams = 0;           
            for(int i = 0; i < list.length; i++){
                for(int j = i + 1; j < list.length; j++){
                    BitSet team = union(list[i], list[j]);
                    int totalTopics = team.cardinality();
                    if(totalTopics > maxTopics){
                        maxTopics = totalTopics;
                        eligibleTeams = 1;
                    } else if(totalTopics == maxTopics){
                        eligibleTeams++;
                    }
                }
            } 
            
            System.out.println(maxTopics);
            System.out.println(eligibleTeams);
        } catch (Exception e){
            e.printStackTrace();
        }
    }
    
    public static BitSet union(BitSet a, BitSet b){
        BitSet set = (BitSet) a.clone();
        set.or(b);
        return set;
    }
}


Questions? Have a neat solution? Comment below!