Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. package acm;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.util.ArrayList;
  7.  
  8. public class BigStringSearch {
  9.     public static void main(String[]args) throws IOException {
  10.         ArrayList<TestCase> al=new ArrayList<TestCase>();
  11.         BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
  12.         String cases=br.readLine();
  13.         while(al.size()<Integer.parseInt(cases)){
  14.             TestCase tc=new TestCase();
  15.             tc.setId(al.size()+1);
  16.             String ptn=br.readLine();
  17.             tc.setPattern(ptn);
  18.             String txt=br.readLine();
  19.             tc.setText(txt);
  20.             al.add(tc);
  21.         }
  22.         for(int i=0;i<al.size();i++){
  23.             TestCase tc=(TestCase)(al.get(i));
  24.             int index=horsPool(tc.getPattern(),tc.getText());
  25.             if(index==-1){
  26.                 System.out.println(tc.getId()+" "+"NOT FOUND");
  27.             }else{
  28.                 System.out.println(tc.getId()+" "+index);
  29.             }
  30.         }
  31.     }
  32.    
  33.     public static int[] shiftTable(String pattern){
  34.         int [] table=new int[256];
  35.         int m=pattern.length();
  36.         for(int i=0;i<table.length;i++){
  37.             table[i]=m;
  38.         }
  39.         for(int j=0;j<m-1;j++){
  40.             table[pattern.charAt(j)]=m-1-j;
  41.         }
  42.         return table;
  43.     }
  44.    
  45.     public static int horsPool(String pattern,String text){
  46.         int[] table=shiftTable(pattern);
  47.         int m=pattern.length();
  48.         int n=text.length();
  49.         int i=m-1;
  50.         while(i<=n-1){
  51.             int k=0;
  52.             while(k<=m-1 && pattern.charAt(m-1-k)==text.charAt(i-k)){
  53.                 k=k+1;
  54.             }
  55.             if(k==m){
  56.                 return i-m+1;
  57.             }else{
  58.                 i=i+table[text.charAt(i)];
  59.             }
  60.         }
  61.         return -1;
  62.     }
  63. }
  64.  
  65. class TestCase{
  66.     int id;
  67.     String pattern;
  68.     String text;
  69.     public int getId() {
  70.         return id;
  71.     }
  72.     public void setId(int id) {
  73.         this.id = id;
  74.     }
  75.     public String getPattern() {
  76.         return pattern;
  77.     }
  78.     public void setPattern(String pattern) {
  79.         this.pattern = pattern;
  80.     }
  81.     public String getText() {
  82.         return text;
  83.     }
  84.     public void setText(String text) {
  85.         this.text = text;
  86.     }
  87.    
  88. }