Cod sursa(job #2683291)

Utilizator mstevanStevan mstevan Data 10 decembrie 2020 20:59:21
Problema Trie Scor 30
Compilator java Status done
Runda Arhiva educationala Marime 3.28 kb
import java.io.*;
import java.util.HashMap;
import java.util.Scanner;

public class Main {
    static Node root = new Node(0);

    public static void main(String []args) {
        File inputFile = new File("trie.in");
        File outputFile = new File("trie.out");

        try {
            FileInputStream inputStream = new FileInputStream(inputFile);
            Scanner scanner = new Scanner(inputStream);

            FileOutputStream outputStream = new FileOutputStream(outputFile);
            PrintWriter writer = new PrintWriter(outputStream);


            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                String[] split = line.split(" ");
                int command = Integer.parseInt(split[0]);
                if (command == 0)
                    insert(split[1]);
                if (command == 1)
                    delete(split[1]);
                if (command == 2)
                    count(split[1], writer);
                if (command == 3)
                    findmax(split[1], writer);
            }

            writer.close();
            outputStream.close();
        } catch(IOException e) {

        }

    }

    private static void findmax(String s, PrintWriter writer) {
        int currentLevel = 0;
        //int maxLength = 0;
        Node currentNode = root;
        for (char character: s.toCharArray()) {
            if (!currentNode.children.containsKey(character)) {
                //maxLength = 0; it doesn't have to be a full word!
                break;
            }
            currentNode = currentNode.children.get(character);
            if (currentNode.passesThrough > 0)
                currentLevel++;
            else
                break;
            //if (currentNode.occurences > 0) - doesn't have to be a full word
            //    maxLength = currentLevel;
        }
        //writer.println(maxLength);
        writer.println(currentLevel);
    }

    private static void count(String s, PrintWriter writer) {
        Node currentNode = root;
        int toPrint = 0;
        for (char character: s.toCharArray()) {
            if (!currentNode.children.containsKey(character)) {
                toPrint = 0;
                break;
            }
            currentNode = currentNode.children.get(character);
            toPrint = currentNode.occurences;
        }
        writer.println(toPrint);
    }

    private static void delete(String s) {
        Node currentNode = root;
        for (char character: s.toCharArray()) {
            currentNode = currentNode.children.get(character);
            currentNode.passesThrough--;
        }
        currentNode.occurences--;
    }

    private static void insert(String s) {
        Node currentNode = root;
        for (char character: s.toCharArray()) {
            if (!currentNode.children.containsKey(character))
                currentNode.children.put(character, new Node(0));
            currentNode = currentNode.children.get(character);
            currentNode.passesThrough++;
        }
        currentNode.occurences++;
    }

    static class Node{
        public HashMap<Character, Node> children = new HashMap<Character, Node>(){};
        public int occurences = 0;
        public int passesThrough = 0;

        public Node(int i) {
            occurences = i;
        }
    }
}