Pagini recente » Cod sursa (job #2824305) | Cod sursa (job #3332446) | Cod sursa (job #2824056) | Statistici Puica Andrei (puica2018) | Cod sursa (job #3332444)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("substr.in");
ofstream fout ("substr.out");
const int nmax = 2e4;
string s;
int n, k, gap, sa[nmax], poz[nmax], tmp[nmax];
bool sufCmp (int i, int j)
{
if (poz[i] != poz[j])
return poz[i] < poz[j];
i += gap;
j += gap;
return i < n && j < n ? poz[i] < poz[j] : i > j;
}
void buildSuffixArray ()
{
n = s.size ();
for (int i = 0; i < n; i++)
{
sa[i] = i;
poz[i] = s[i];
}
for (gap = 1; ; gap *= 2)
{
sort (sa, sa + n, sufCmp);
for (int i = 0; i < n - 1; i++)
tmp[i + 1] = tmp[i] + sufCmp (sa[i], sa[i + 1]);
for (int i = 0; i < n; i++)
poz[sa[i]] = tmp[i];
if (tmp[n - 1] == n - 1)
break;
}
}
int lcp[nmax];
void buildLcp ()
{
for (int i = 0, k = 0; i < n; i++)
{
if (poz[i] == n - 1)
continue;
for (int j = sa[poz[i] + 1]; s[i + k] == s[j + k];)
k++;
lcp[poz[i]] = k;
if (k)
k--;
}
}
signed main ()
{
fin >> n >> k;
fin >> s;
buildSuffixArray ();
buildLcp ();
deque <int> dq;
int w = k - 1;
int rez = 0;
for (int i = 0; i < n - 1; i++)
{
while (!dq.empty () && lcp[dq.back ()] >= lcp[i])
dq.pop_back ();
dq.push_back (i);
while (!dq.empty () && dq.front () <= i - w)
dq.pop_front ();
if (i >= w - 1)
rez = max (rez, lcp[dq.front ()]);
}
fout << rez;
return 0;
}