Pagini recente » Cod sursa (job #2310607) | Cod sursa (job #2141102) | Cod sursa (job #176796) | Cod sursa (job #1533120) | Cod sursa (job #1689317)
#include <bits/stdc++.h>
#define F first
#define S second
using namespace std;
const int maxlog = 14;
const int nmax = (1 << 14) + 10;
int p[maxlog+1][nmax];
pair < pair < int , int > , int > v[nmax];
int n , k;
char s[nmax];
void bagaSA()
{
int i , j;
for (i = 1; i <= n; ++i) p[0][i] = s[i] - 'a';
for (i = 1; (1 << i) <= n; ++i)
{
for (j = 1; j <= n; ++j)
{
v[j].F = {p[i-1][j] , p[i-1][j+(1<<(i-1))]};
v[j].S = j;
}
sort(v + 1 , v + n + 1);
for (j = 1; j <= n; ++j)
p[i][v[j].S] = p[i][v[j-1].S] + (v[j].F != v[j-1].F);
}
}
int lcp(int a , int b)
{
if (a == b) return n - a;
int ret = 0;
for (int i = maxlog; i >= 0; --i)
if ((1 << i) <= n && p[i][a] == p[i][b])
a += (1 << i), b += (1 << i), ret += (1 << i);
return ret;
}
int solve()
{
int ret = 0;
for (int i = 1; i <= n - k + 1; ++i)
ret = max(ret , lcp(v[i].S , v[i+k-1].S));
return ret;
}
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d %d\n", &n, &k);
gets(s+1);
bagaSA();
printf("%d\n", solve());
return 0;
}