Подстрока может иметь длину 1,2,3... Вопрос, который я пытался решить, заключался в поиске подстроки, которая встречается максимальное количество раз. Таким образом, в основном это сводилось к поиску персонажа с максимальной частотой. Однако я обнаружил, что могу найти самую длинную повторяющуюся подстроку, используя дерево суффиксов за O (n). Но дерево суффиксов возвращает подстроку, сохраняя длину в качестве приоритета. Я хотел найти подстроку, которая встречается наибольшее количество раз, и из этих подстрок я хочу найти самую длинную. Например:
In the following string: ABCZLMNABCZLMNABC
A suffix tree will return ABCZLMN as the longest repeating substring.
However, what I am looking for is ABC; as it is the longest out of all the ones having frequency = 3.
Я попытался решить эту проблему, сгенерировав подстроку между двумя индексами i и j. После этого нахождение вхождений этих подстрок в каждом случае с использованием Z-алгоритма, работающего за O(n). Однако общая сложность была O (n ^ 3)
Мой код O(n^3)
map<ll,vector<string>> m;
string s; cin >> s;
for(ll i=0;i<s.length();i++){
string c;
for(ll len=0; i+len<s.length();len++){
c+=s[i+len];
ll z[N];
ll l=0,r=0;
string kk;
for(ll p=0;p<c.length();p++){
kk+=c[p];
}
kk+="#";
for(ll p=0;p<s.length();p++){
kk+=s[p];
}
for(ll k=1;k<kk.length();k++){
if(k>r){
l=r=k;
while(r<c.length()&&kk[r-l]==kk[r])r++;
z[k]=r-l;
r--;
}
else{
ll m=k-l;
if(z[m]<r-k+l)z[k]=z[m];
else{
l=k;
while(r<c.length()&&kk[r-l]==kk[r])r++;
z[k]=r-l;
r--;
}
}
}
ll occ=0;
for(ll n=0;n<kk.length();n++){
if(z[n]==c.length())occ++;
}
m[occ].push_back(c);
}
}
Я не могу найти подходящего решения, чтобы сделать его эффективным. Пожалуйста, помогите. Спасибо.