Sunday, November 7, 2021

USACO "Guess The Animal" Java Solution

/*
* Solution to 2019 USACO January Bronze Problem: Guess the Animal
*/

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

class guess {

    public static void main (String [] args) throws IOException {

        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(System.out);
        StringTokenizer st;

        st = new StringTokenizer(in.readLine());  
        int N = Integer.parseInt(st.nextToken());
        // out.println(N);  // DEBUG PRINT
        
        ArrayList<HashSet<String>> list = new ArrayList<HashSet<String>>();

		for (int i=0; i<N; i++) {

            st = new StringTokenizer(in.readLine());   
			String name = st.nextToken();
            int nqualities = Integer.parseInt(st.nextToken());

            // out.println(name + " " + nqualities); // DEBUG PRINT
            HashSet<String> tempset = new HashSet<String>();

			for (int j=0; j<nqualities; j++) {
			    tempset.add(st.nextToken());	
		    }
            list.add(tempset);
        }

        // out.println(list.toString()); // DEBUG PRINT
        int maxoverlap = 0;

        for (int i=0; i<N; i++) {
            for (int j=i+1; j<N; j++) {
                // make a copy of the HashSet at list.get(i) 
                //     because retainAll is destructive, 
                //         want to keep list intact
                HashSet<String> intersection = new HashSet<String>(list.get(i));
                intersection.retainAll(list.get(j));
                int overlap = intersection.size();
                if (overlap>maxoverlap) {
                    maxoverlap = overlap;
                }
                // out.println(i + " " + j + " " + intersection.toString() + " " + overlap); // DEBUG PRINT
            }
        }
        int answer = maxoverlap+1;
        out.println(answer); 
        // out.println(list.toString()); // DEBUG PRINT
        out.close();
    }
}