Witam, staram się rozwiązać zadanie na SPOJ (NAMES), ma ograniczenie czasowe 5 s. Mój program wyświetla dobre wyniki, jednak nie mieści się w tym czasie. Poniżej zamieszczam to zadanie zrobione na dwa sposoby. Czy możecie mi powiedzieć, czy da się np. szybciej wczytywać dane? Już dużo godzin nad tym spędziłem i nic. Z góry dziękuję za pomoc.

import java.util.*;
import java.io.*;
public class Main
{
    public static class Imie
    {
        String imie;
        int il;
        public Imie(String tab)
        {
            imie=new String(tab);
            il=1;
        }
        public String toString()
        {
            return imie+" "+il;
        }
        public boolean equals(Object im)
        {
            Imie i=(Imie)im;
            return i.imie.equals(imie);
        }
    }
    public static class Komparator implements Comparator<Imie>
    {
        public int compare(Imie s1, Imie s2)
        {
            if(s1.il<s2.il) return 1;
            else if(s1.il>s2.il) return -1;
            else return s1.imie.compareTo(s2.imie);
        }
    }
    public static void main(String[] args)throws IOException
    {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)),true);
        StringBuilder temp=new StringBuilder();
        int tmp='a';
        List<Imie> list=new ArrayList<Imie>();
        String test;
        while(in.ready())
        {
            in.read();in.read();in.read();in.read();
            while(tmp!=' ')
            {
                tmp=in.read();
            }
            while(in.ready() && (tmp=in.read())!='\n')
            {
                temp.append((char)tmp);
            }
            Imie pom=new Imie(temp.toString().toUpperCase());
            if(!list.contains(pom)) list.add(pom);
            else
            {
                list.get(list.indexOf(pom)).il++;
            }
            temp.setLength(0);
        }
        Collections.sort(list,new Komparator());
        for(Imie el: list)
        {
            out.println(el);
        }
    }
}
import java.io.*;
import java.util.*;
public class Main
{
    public static class Imie implements Comparable<Imie>
    {
        String imie;
        int il;
        public Imie(String tab)
        {
            imie=tab;
            il=1;
        }
        public String toString()
        {
            return imie+" "+il;
        }
        public boolean equals(Object im)
        {
            Imie i=(Imie)im;
            return i.imie.equals(imie);
        }
        public int compareTo(Imie im)
        {
            if(il<im.il) return 1;
            else if(il>im.il) return -1;
            else return imie.compareTo(im.imie);
        }
    }
    public static void main(String[] args)throws IOException
    {
        PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)),true);
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        StreamTokenizer st = new StreamTokenizer(br);
        List<Imie> list=new LinkedList<Imie>();
        Imie temp;
        String pom;
        while(br.ready())
        {
            st.nextToken();
            st.nextToken();
            st.nextToken();
            temp=new Imie(st.sval.toUpperCase());
            if(list.contains(temp))
            {
                list.get(list.indexOf(temp)).il++;
            }
            else
            {
                list.add(temp);
            }
        }
        Collections.sort(list);
        for(Imie el: list)
        {
            out.println(el);
        }
    }
}