Pagini recente » Cod sursa (job #2445930) | Cod sursa (job #2144821) | Cod sursa (job #1714281) | Cod sursa (job #2282080) | Cod sursa (job #2873189)
#include <algorithm>
#include <fstream>
#define N_MAX 17000
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
int n, i, j, k, cnt, maxi, p[N_MAX][17], lg[N_MAX], sa[N_MAX];
char s[N_MAX];
struct pct
{
int a, b, ind;
bool operator<(const pct &B) const{
if (a != B.a)
return a < B.a;
return b < B.b;
}
} v[N_MAX];
static inline int lcp(int x, int y)
{
if (x == y)
return n - x + 1;
int sol = 0;
for (j = lg[n]; j >= 0; --j)
if (p[x][j] == p[y][j])
sol += (1 << j), x += (1 << j), y += (1 << j);
return sol;
}
int main()
{
ios::sync_with_stdio(false);
f.tie(nullptr);
f >> n >> k;
f >> (s + 1);
for (i = 1; i <= n; ++i)
p[i][0] = int(s[i]);
for (i = 2; i <= n; ++i)
lg[i] = lg[i >> 1] + 1;
if ((1 << lg[n]) < lg[n])
++lg[n];
for (j = 1; j <= lg[n]; ++j)
{
for (i = 1; i <= n; ++i)
{
v[i].a = p[i][j - 1];
v[i].b = p[i + (1 << (j - 1))][j - 1];
v[i].ind = i;
}
sort(v + 1, v + n + 1);
cnt = 0;
p[v[1].ind][j] = ++cnt;
for (i = 2; i <= n; ++i)
if (v[i - 1].a != v[i].a || v[i - 1].b != v[i].b)
p[v[i].ind][j] = ++cnt;
else
p[v[i].ind][j] = cnt;
}
for (i = 1; i <= n; ++i)
sa[p[i][lg[n]]] = i;
for (i = 1; i <= n - k + 1; ++i)
maxi = max(maxi, lcp(sa[i], sa[i + k - 1]));
g << maxi;
return 0;
}