Skip to content

Instantly share code, notes, and snippets.

@yssharma
Created November 15, 2012 16:22
Show Gist options
  • Select an option

  • Save yssharma/4079498 to your computer and use it in GitHub Desktop.

Select an option

Save yssharma/4079498 to your computer and use it in GitHub Desktop.
SubString using suffix array logic
/*********************************************
My TestCases:
2
aab
aac
3
3
7
23
----------
6
banana
anaconda
anamoly
band
blue
ugly
6
37
93
25
2
50
12
**********************************************/
package strings;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
public class Solution{
public static void solution1()
{
Scanner sc = new Scanner(System.in);
int noOfStr = sc.nextInt();
/** Create suffix map instead of suffix array **/
Map<String,Integer> unionMap = new TreeMap<String, Integer>();
String input = null;
String subStr=null;
for (int i = 0; i < noOfStr; i++) {
input = sc.next();
int len = input.length();
for (int start = 0; start < len; start++){
subStr = input.substring(start);
unionMap.put(subStr,subStr.length());
}
}
/** Sort the suffixes **/
ArrayList<String> suffixArr = new ArrayList<String>(unionMap.keySet());
Collections.sort(suffixArr);
int sufArrSize = suffixArr.size();
int substrSum[] = new int[sufArrSize];
int overlap = 0;
String s1=null,s2=null;
substrSum[0] = suffixArr.get(0).length();
int max = 0;
for(int i=0; i<sufArrSize-1; i++){
overlap=0;
s1=suffixArr.get(i);
s2=suffixArr.get(i+1);
for(int j=0; j<suffixArr.get(i).length(); j++){
if(s1.charAt(j)==s2.charAt(j)){
overlap++;
}
else
break;
}
max= substrSum[i+1]= substrSum[i] + (s2.length()-overlap);
}
int noOfOutput = sc.nextInt();
/*for(int i=0; i<substrSum.length; i++)
System.out.println(suffixArr.get(i)+"\t"+substrSum[i]);
*/
for (int i = 0; i < noOfOutput; i++) {
int index = sc.nextInt();
if (index > max){
//System.out.println("index:"+index+",max:"+max);
System.out.println("INVALID");
}
else{
int ind = binSearch(substrSum, index, 0, sufArrSize-1);
//System.out.println("index:"+index+",ind:"+ind+",val[ind]:"+substrSum[ind]);
System.out.println(suffixArr.get(ind).substring(0, (suffixArr.get(ind).length()-(substrSum[ind] - index))));
}
}
}
public static int binSearch(int[] in, int num, int low, int high){
if(low>high)
return ((low+high)/2)+1;
if(low==high)
return low;
int mid = (low+high)/2;
if(in[mid]==num)
return mid;
else if(num > in[mid])
return binSearch(in, num, mid+1, high);
else
return binSearch(in, num, low, mid);
}
public static void main(String[] a) {
Solution.solution1();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment