Advertisement
Nickpips

Trie Stuff

Apr 17th, 2017
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.32 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.Scanner;
  4.  
  5. public class trie {
  6.  
  7.     public static class Word implements Comparable<Word> {
  8.         String str = null;
  9.         long freq = 0;
  10.  
  11.         public Word(String s, long f) {
  12.             str = s;
  13.             freq = f;
  14.         }
  15.  
  16.         @Override
  17.         public int compareTo(Word arg) {
  18.             return -(new Long(this.freq).compareTo(arg.freq));
  19.         }
  20.     }
  21.  
  22.     public static class Node {
  23.         public ArrayList<Node> children = new ArrayList<Node>();
  24.         public ArrayList<Word> suggestions = new ArrayList<Word>();
  25.  
  26.         public String str = null;
  27.        
  28.         public Node(String s) {
  29.             str = s;
  30.         }
  31.     }
  32.  
  33.     public static void insert(Node root, Word w) {
  34.         if (!w.str.startsWith(root.str)) {
  35.             return;
  36.         }
  37.        
  38.         root.suggestions.add(w);
  39.         Collections.sort(root.suggestions);
  40.         if (root.suggestions.size() > 3) {
  41.             root.suggestions.remove(3);
  42.         }
  43.  
  44.         boolean found = false;
  45.         for (Node child : root.children) {
  46.             if (w.str.startsWith(child.str)) {
  47.                 found = true;
  48.                 insert(child, w);
  49.             }
  50.         }
  51.         if (found == false && w.str.length() > root.str.length()) {
  52.             Node n = new Node(w.str.substring(0, root.str.length() + 1));
  53.             root.children.add(n);
  54.             insert(n, w);
  55.         }
  56.     }
  57.    
  58.     // O(length)
  59.     public static ArrayList<Word> find(Node n, String s) {
  60.         for(Node child : n.children) {
  61.             if(s.startsWith(child.str)) {
  62.                 return find(child, s);
  63.             }
  64.         }
  65.         if( s.length() > n.str.length() )
  66.             return new ArrayList<Word>();
  67.         else
  68.             return n.suggestions;
  69.     }
  70.  
  71.     public static void main(String[] args) {
  72.         Node root = new Node("");
  73.        
  74.         Scanner in = new Scanner(System.in);
  75.         int N = in.nextInt();
  76.         for( int i = 0; i < N; i++ ) {
  77.             String str = in.next().toUpperCase();
  78.             long freq = in.nextLong();
  79.             insert(root, new Word(str, freq));
  80.         }
  81.         int Q = in.nextInt();
  82.         for( int i = 0; i < Q; i++ ) {
  83.             String str = in.next().toUpperCase();
  84.             ArrayList<Word> ans = find(root, str);
  85.             for(Word n : ans) {
  86.                 System.out.println(n.str);
  87.             }
  88.         }
  89.        
  90.         in.close();
  91.     }
  92. }
  93.  
  94.  
  95. /*
  96. TEST:
  97. 10
  98. Project 5
  99. Propane 3
  100. Prudent 1
  101. Plump 2
  102. Apple 7
  103. Amazon 2
  104. Amazing 6
  105. Testing 4
  106. Test 5
  107. Grape 6
  108. 10
  109. P
  110. > Project
  111. > Propane
  112. > Plump
  113. Pr
  114. > Project
  115. > Propane
  116. > Prudent
  117. Pro
  118. > Project
  119. > Propane
  120. Proj
  121. > Project
  122. Projk
  123. >
  124. Gr
  125. > Grape
  126. Ga
  127. >
  128. App
  129. > Apple
  130. Apl
  131. >
  132. A
  133. > Apple
  134. > Amazing
  135. > Amazon
  136.  
  137. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement