Pagini recente » Cod sursa (job #1138970) | Cod sursa (job #2460519) | Cod sursa (job #2047574) | Cod sursa (job #1952597) | Cod sursa (job #2040361)
#include <bits/stdc++.h>
using namespace std;
int dp[20][16386],n,k;
pair <pair <int , int> , int> s[16386];
char ss[16386];
inline int lcp(int p1, int p2)
{
if (p1 == p2)
return n - p1 + 1;
int logg = 0;
for (; (1 << logg) <= n ; ++logg);
--logg;
int lung = 0;
for (int i = logg; i>=0; --i)
if (dp[i][p1] == dp[i][p2])
p1 += (1 << i) , p2 += (1 << i), lung += (1 << i);
return lung;
}
int main()
{
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
scanf("%d %d\n", &n, &k);
gets(ss + 1);
for (int i = 1; i<=n; ++i)
dp[0][i] = ss[i] - '0';
for (int i = 1; (1 << i) <=n ; ++i)
{
for (int j = 1; j<=n; ++j)
{
s[j].first.first = dp[i - 1][j];
if (j + (1 << (i - 1)) <= n)
s[j].first.second = dp[i-1][j + (1 << (i - 1))];
else s[j].first.second = -1;
s[j].second = j;
}
sort(s + 1, s + n + 1);
int last = 0;
for (int j = 1; j<=n; ++j)
if (s[j].first != s[j - 1].first)
dp[i][s[j].second] = ++last;
else dp[i][s[j].second] = last;
}
int ans = 0;
for (int i = 1; i <= n - k + 1; ++i)
ans = max(ans , lcp(s[i].second , s[i + k - 1].second));
printf("%d\n", ans);
return 0;
}