class
Main {
static
class
Node {
int
start, end;
int
length;
int
[] insertEdge =
new
int
[
26
];
int
suffixEdge;
}
static
Node root1 =
new
Node();
static
Node root2 =
new
Node();
static
Node[] tree =
new
Node[
1000
];
static
int
ptr;
static
int
currNode;
static
String s;
public
static
void
main(String[] args) {
root1.length = -
1
;
root1.suffixEdge =
1
;
root2.length =
0
;
root2.suffixEdge =
1
;
for
(
int
i =
0
; i <
1000
; i++) {
tree[i] =
new
Node();
}
tree[
1
] = root1;
tree[
2
] = root2;
ptr =
2
;
currNode =
1
;
s =
"forgeeksskeegfor"
;
int
l = s.length();
for
(
int
i =
0
; i < l; i++) {
insert(i);
}
int
maxx =
0
;
String result =
""
;
for
(
int
i =
3
; i <= ptr; i++) {
StringBuilder res =
new
StringBuilder();
for
(
int
j = tree[i].start; j <= tree[i].end; j++) {
res.append(s.charAt(j));
}
if
(res.length() > maxx) {
maxx = res.length();
result = res.toString();
}
}
System.out.println(result);
}
static
void
insert(
int
idx) {
int
tmp = currNode;
while
(
true
) {
int
curLength = tree[tmp].length;
if
(idx - curLength >=
1
&& s.charAt(idx) == s.charAt(idx - curLength -
1
)) {
break
;
}
tmp = tree[tmp].suffixEdge;
}
if
(tree[tmp].insertEdge[s.charAt(idx) -
'a'
] !=
0
) {
currNode = tree[tmp].insertEdge[s.charAt(idx) -
'a'
];
return
;
}
ptr++;
tree[tmp].insertEdge[s.charAt(idx) -
'a'
] = ptr;
tree[ptr].length = tree[tmp].length +
2
;
tree[ptr].end = idx;
tree[ptr].start = idx - tree[ptr].length +
1
;
tmp = tree[tmp].suffixEdge;
currNode = ptr;
if
(tree[currNode].length ==
1
) {
tree[currNode].suffixEdge =
2
;
return
;
}
while
(
true
) {
int
curLength = tree[tmp].length;
if
(idx - curLength >=
1
&& s.charAt(idx) == s.charAt(idx - curLength -
1
)) {
break
;
}
tmp = tree[tmp].suffixEdge;
}
tree[currNode].suffixEdge = tree[tmp].insertEdge[s.charAt(idx) -
'a'
];
}
}