终于有算最长重复子串(数)的后缀数组啦,nice
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
const int MAX = 25000;
1
#include <cstdio>
2
#include <string>
3
#include <algorithm>
4
using namespace std;
5
6
const int MAX = 25000;
7
int num[MAX];
8
int mem[3][MAX], c[MAX];
9
int * SA, * Rank, * nSA, * nRank;
10
int n,kk,nmax;
11
12
void make_sa()
13
{
14
int i,j;
15
SA = mem[0]; Rank = mem[1]; nSA = mem[2];
16
memset(c,0,sizeof(c));
17
for(i=0;i<n;i++) {
18
c[ num[i] +1] ++;
19
}
20
for(i=1;i<=nmax+1;i++) {
21
c[i] += c[i-1];
22
}
23
for(i=0;i<n;i++) {
24
SA[ --c[ num[i] +1] ] = i;
25
}
26
Rank[ SA[0] ] = 0;
27
for(i=1;i<n;i++) {
28
Rank[SA[i]] = Rank[SA[i-1]];
29
if(num[SA[i]] != num[SA[i-1]]) {
30
Rank[SA[i]] ++;
31
}
32
}
33
34
int k;
35
for(k=1;k<n && Rank[ SA[n-1] ] < n-1;k*=2) {
36
memset(c,0,sizeof(c));
37
for(i=0;i<n;i++) {
38
c[ Rank[SA[i]] ] ++;
39
}
40
for(i=1;i<n;i++) {
41
c[i] += c[i-1];
42
}
43
for(i=n-1;i>=0;i--) {
44
if(SA[i] >= k) {
45
nSA[ -- c[ Rank[SA[i]-k] ] ] = SA[i] - k;
46
}
47
}
48
for(i=n-k;i<n;i++) {
49
nSA[ -- c[Rank[i]] ] = i;
50
}
51
nRank = SA;
52
nRank[ nSA[0] ] = 0;
53
for(i=1;i<n;i++) {
54
nRank[ nSA[i] ] = nRank[ nSA[i-1] ];
55
if(Rank[nSA[i]] != Rank[nSA[i-1]] || Rank[nSA[i]+k] != Rank[nSA[i-1]+k]) {
56
nRank[ nSA[i] ] ++;
57
}
58
}
59
SA = nSA;
60
nSA = Rank;
61
Rank = nRank;
62
}
63
}
64
65
int h[MAX];
66
int get_lcp()
67
{
68
int i,j,k;
69
70
for(i=0,k=0;i<n;i++) {
71
if(Rank[i] == n-1) {
72
h[ Rank[i] ] = k = 0;
73
}
74
else {
75
if(k > 0) {
76
k --;
77
}
78
j = SA[Rank[i] +1];
79
while(num[i+k] == num[j+k]) {
80
k ++;
81
}
82
h[ Rank[i] ] = k;
83
}
84
}
85
int ret = 0;
86
kk --;
87
for(i=0;i<n-kk;i++) {
88
int t = INT_MAX;
89
for(j=0;j<kk;j++) {
90
t = min(t, h[i+j]);
91
}
92
ret = max(t, ret);
93
}
94
return ret;
95
}
96
97
int main()
98
{
99
int i,j;
100
while(scanf("%d %d", &n,&kk)==2) {
101
nmax = -1;
102
for(i=0;i<n;i++) {
103
scanf("%d", num+i);
104
nmax = max(nmax, num[i]);
105
}
106
num[n ++] = -1;
107
make_sa();
108
printf("%d\n", get_lcp());
109
}
110
}
111

2

3

4

5

6

7

8

9

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

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111
