#include <bits/stdc++.h>
using
namespace
std;
void
calculatePrefixFunction(
const
string& s,
int
prefixFunction[])
{
int
stringSize = s.size();
for
(
int
i = 0, j = -1; i < stringSize;
prefixFunction[++i] = ++j) {
while
(~j && s[i] != s[j]) {
j = prefixFunction[j];
}
}
}
int
findLongestValidSubstring(
const
string& s,
const
int
prefixFunction[])
{
int
stringSize = s.size();
int
longestSubstringLength = 0;
for
(
int
i = 1; i < stringSize; i++) {
if
(prefixFunction[i] == prefixFunction[stringSize]
|| prefixFunction[i]
== prefixFunction
[prefixFunction[stringSize]]) {
longestSubstringLength = max(
longestSubstringLength, prefixFunction[i]);
}
}
return
longestSubstringLength;
}
int
main()
{
string s =
"fixprefixsuffix"
;
int
stringSize = s.size();
int
prefixFunction[stringSize + 1] = { -1 };
calculatePrefixFunction(s, prefixFunction);
int
longestSubstringLength
= findLongestValidSubstring(s, prefixFunction);
cout << (longestSubstringLength
? s.substr(0, longestSubstringLength)
:
"-1"
);
}