您的位置:首页 > 其它

题目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);
}
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: