题目1099:后缀子串排序
2014-01-18 23:19
176 查看
import java.io.FileReader; import java.io.IOException; import java.io.BufferedReader; import java.io.InputStreamReader; class Main { public static final boolean DEBUG = false; public static final int N = 255; public static String s; public static final int M = 1000; public static int[] c, t, t2, sa; public static void build_sa(int m) { c = new int[M]; t = new int[M]; t2 = new int[M]; sa = new int[M]; int n = s.length(); for (int i = 0; i < n; i++) { c[t[i] = s.charAt(i)]++; } for (int i = 1; i < m; i++) c[i] += c[i - 1]; for (int i = n - 1; i >= 0; i--) { sa[--c[t[i]]] = i; } for (int k = 1; k <= n; k <<= 1) { int p = 0; for (int i = n - k; i < n; i++) t2[p++] = i; for (int i = 0; i < n; i++) { if (sa[i] >= k) t2[p++] = sa[i] - k; } for (int i = 0; i < m; i++) c[i] = 0; for (int i = 0; i < n; i++) c[t[t2[i]]]++; for (int i = 1; i < m; i++) c[i] += c[i - 1]; for (int i = n - 1; i >= 0; i--) { sa[--c[t[t2[i]]]] = t2[i]; } int[] tmp = new int[M]; tmp = t; t = t2; t2 = tmp; p = 1; t[sa[0]] = 0; for (int i = 1; i < n; i++) { t[sa[i]] = (t2[sa[i]] == t2[sa[i - 1]] && t2[sa[i - 1] + k] == t2[sa[i] + k]) ? p - 1 : p++; } if (p >= n) break; m = p; } } public static void main(String[] args) throws IOException { BufferedReader cin; if (DEBUG) { cin = new BufferedReader(new FileReader("d:\\OJ\\uva_in.txt")); } else { cin = new BufferedReader(new InputStreamReader(System.in)); } while ((s = cin.readLine()) != null) { build_sa(N); for (int i = 0; i < s.length(); i++) { int start = sa[i]; String tmp = s.substring(start); System.out.println(tmp); } } } }
相关文章推荐
- 九度题目1099:后缀子串排序
- 题目1099:后缀子串排序(qsort函数自定义cmp函数)
- <九度 OJ>题目1099:后缀子串排序
- 【九度】题目1099:后缀子串排序
- 九度oj 题目1099:后缀子串排序
- 题目1099:后缀子串排序
- 九度OJ 题目1099:后缀子串排序
- 题目1099:后缀子串排序 C++\Java
- jobdu 题目1099:后缀子串排序
- 九度OJ—题目1099:后缀子串排序
- 九度oj 1099 后缀子串排序
- 九度OJ 1099:后缀子串排序 (排序)
- 九度OJ 1099 后缀子串排序 JAVA
- 九度OJ 1099:后缀子串排序 (排序)
- 九度 1099:后缀子串排序
- 九度OJ-1099:后缀子串排序
- 九度OJ 1099 后缀子串排序
- 九度OJ1099:后缀子串排序解题报告
- UVA 题目760 DNA Sequencing (后缀数组求两个串最长公共子串,字典序输出)
- SPOJ 题目1811 LCS - Longest Common Substring(后缀自动机求最长公共子串)