Pagini recente » Cod sursa (job #1611780) | Cod sursa (job #3186912) | Cod sursa (job #2899221) | Cod sursa (job #1351652) | Cod sursa (job #1733732)
#include <fstream>
#include <vector>
#include <algorithm>
#include <string>
#define LOCAL
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#define Nmax 16384
#define logN 15
struct suff
{
int p;
pii nr;
bool operator <(const suff &s) const { return nr < s.nr; }
bool operator ==(const suff &s) const { return nr == s.nr; }
};
int p[logN][Nmax], order[Nmax], line;
suff L[Nmax];
void suffixArrays(const string&);
int lcp(int, int, int);
int main()
{
ifstream fin("substr.in");
ofstream fout("substr.out");
int i, n, k, pmax;
string s;
(fin >> n >> k).ignore();
fin >> s;
suffixArrays(s);
for (pmax = 0, i = 0; i + k <= n; ++i) pmax = max(pmax, lcp(order[i], order[i + k - 1], n));
fout << pmax << '\n';
return 0;
}
void suffixArrays(const string &s)
{
int i, diff, step;
for (i = 0; i < s.length(); ++i) p[0][i] = static_cast<int>(s[i]);
for (step = 1, diff = 1; diff < s.length(); diff <<= 1, ++step)
{
for (i = 0; i < s.length(); ++i)
{
L[i].nr.first = p[step - 1][i];
L[i].nr.second = (i + diff < s.length() ? p[step - 1][i + diff] : -1);
L[i].p = i;
}
sort(L, L + s.length());
for (i = 0; i < s.length(); ++i)
p[step][L[i].p] = (i > 0 && L[i] == L[i - 1] ? p[step][L[i - 1].p] : i);
}
line = step - 1;
for (i = 0; i < s.length(); ++i) order[i] = L[i].p;
}
int lcp(int s1, int s2, int n)
{
int res, step;
for (res = 0, step = line; step; --step)
if (p[step][s1] == p[step][s2])
res += 1 << step,
s1 += 1 << step,
s2 += 1 << step;
return res;
}