Ciao a tutti, ho da preparare un progetto per l'università, ll testo del progetto è questo.

Sia S una collezione di stringhe. Ogni stringa in S è associata ad una serie di tag.
Ad esempio la stringa “ruota” è associata ai tag “automobile” e “panoramica”.
Implementare una struttura dati che permetta di gestire l’inserimento di nuove stringhe e la stampa delle stringhe a partire dai tag.

In particolare, le operazioni possibili sono:

  • a elem tag1 ... tagN -1: Associa i tag1 ... tagN (N>=1) alla stringa elem (i tag sono separati da uno spazio, il -1 indica la fine della specifica dell’operazione).
  • s subtag -1: Stampa il numero di tutte le stringhe distinte associate ai tag riferiti da “subtag” (il -1 indica la fine della specifica dell’operazione).
    • La stringa subtag si riferisce a tutti i tag di cui è prefisso. Ad esempio, il subtag aut si riferisce ai tag automobile, auto, autovettura, autista, ecc.
    • Se nessun tag è associato al subtag, stampare la stringa speciale
      “missing”.



Note:

  • Un elemento può apparire più volte in operazioni di add. Esempio:
    • a pesca frutta sport -1
    • a pesca colore -1
    • a pesca frutta sport -1
    • a mela frutta -1


  • ogni tag può essere associato ad uno o più elementi. Nell’esempio sopra, frutta è associato sia a pesca che a mela.



INPUT
La lettura dovrà avvenire da standard input. Per ogni test, la prima linea contiene il carattere i e un intero n che rappresenta il numero di operazioni da effettuare.
Le restanti n linee contengono le operazioni da effettuare.

OUTPUT
L’output del programma è dato dalle stampe dell’operazione s.

N.B.: L’ultima riga conterrà la stringa “<END>”.
io l'ho fatto cosi

codice:
ackage progettoalgoritmi;

import java.util.HashMap;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Map;
import java.util.StringTokenizer;

/**
 *
 * @author salvo
 */
public class Struttura {

    private final HashMap<String, String> mappa;
    private static BufferedReader br;
    private final ArrayList<String> listaDaRitornare;
    private final HashSet<String> insieme;

    public Struttura() {
        this.mappa = new HashMap<String, String>();
        this.listaDaRitornare = new ArrayList<String>();
        this.insieme = new HashSet<String>();

    }

    public void leggi() {
        br = new BufferedReader(new InputStreamReader(System.in));
        Integer n =Integer.MIN_VALUE;
        boolean esci;
        String id;
        try {
            id = "continua";
//            esce dal ciclo solo quando viene letto <END>
            while (!id.equals("<END>")) {
                String stringRead = br.readLine();
                StringTokenizer st = new StringTokenizer(stringRead, " ");
                id = st.nextToken()/*.trim()*/;
                esci = true;
                if (id.equals("i")) {
                    n = Integer.parseInt(st.nextToken());
                }
//                Se si tratta di un add entra in questo if
                if (id.equals("a") && n > 0) {
                    String elem = st.nextToken();
                    String tag = null;
                    while (esci) {
                        if (tag != "-1" && tag != null) {
                            this.mappa.put(tag, elem);
                        }
                        tag = st.nextToken()/*.trim()*/;
                        if (tag.equals("-1")) {
                            esci = false;
                        }
                    }
                    n--;
                } //                Se si tratta di una stampa entra in questo if
                else if (id.equals("s") && n > 0) {
                    String subTag = st.nextToken()/*.trim()*/;
                    insieme.clear();
                    for (Map.Entry<String, String> entry : mappa.entrySet()) {
                        String valore = entry.getKey()/*.trim()*/;
                        if (valore.startsWith(subTag)) {
                            insieme.add(valore);
                        }
                    }
                    if (insieme.isEmpty()) {
                        listaDaRitornare.add("missing");
                    } else {
                        listaDaRitornare.add(Integer.toString(insieme.size()));
//                        System.out.println(lista.size());
                    }
                    n--;
                }
            }
            br.close();
        } catch (IOException ex) {
            System.out.println("Impossibile leggere i dati");
        }

        for (String string : listaDaRitornare) {
            System.out.println(string);
        }

    }


    public static void main(String[] args) {
        Struttura struttura = new Struttura();
        struttura.leggi();

    }
}
il progetto da i risultati che mi aspetto, solo che il tester mi da time limit, dove la sua definezione è : "o va in loop o impiega troppo tempo".

Consigli o da segnalare errori?? mi servirebbe farlo il piu possibile efficiente. Grazie a tutti coloro che mi aiuteranno.