| 
0102
 03
 04
 05
 06
 07
 08
 09
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 
 | package algs63;  // section 6.3
import stdlib.*;
/* ***********************************************************************
 *  Compilation:  javac KWIK.java
 *  Execution:    java KWIK file.txt
 *  Dependencies: StdIn.java In.java
 *  Data files:   http://algs4.cs.princeton.edu/63suffix/tale.txt
 *
 *  %  java KWIK tale.txt 15
 *  majesty
 *   most gracious majesty king george th
 *  rnkeys and the majesty of the law fir
 *  on against the majesty of the people
 *  se them to his majestys chief secreta
 *  h lists of his majestys forces and of
 *
 *  the worst
 *  w the best and the worst are known to y
 *  f them give me the worst first there th
 *  for in case of the worst is a friend in
 *  e roomdoor and the worst is over then a
 *  pect mr darnay the worst its the wisest
 *  is his brother the worst of a bad race
 *  ss in them for the worst of health for
 *   you have seen the worst of her agitati
 *  cumwented into the worst of luck buuust
 *  n your brother the worst of the bad rac
 *   full share in the worst of the day pla
 *  mes to himself the worst of the strife
 *  f times it was the worst of times it wa
 *  ould hope that the worst was over well
 *  urage business the worst will be over i
 *  clesiastics of the worst world worldly
 *
 *************************************************************************/
public class KWIK {
  public static void main(String[] args) {
    In in = new In(args[0]);
    int context = Integer.parseInt(args[1]);
    // read in text
    String text = in.readAll().replaceAll("\\s+", " ");
    int N = text.length();
    // build suffix array
    SuffixArray sa = new SuffixArray(text);
    // find all occurrences of queries and give context
    while (StdIn.hasNextLine()) {
      String query = StdIn.readLine();
      for (int i = sa.rank(query); i < N && sa.select(i).startsWith(query); i++) {
        int from = Math.max(0, sa.index(i) - context);
        int to   = Math.min(N-1, from + query.length() + 2*context);
        StdOut.println(text.substring(from, to));
      }
      StdOut.println();
    }
  }
}
 |