Pagini recente » Cod sursa (job #4186) | Cod sursa (job #1552217) | Cod sursa (job #1094281) | ojji | Cod sursa (job #1581419)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int nmax = 16384;
const int maxlg = 17;
struct entry
{
int nr[2], pos;
bool operator== (const entry &other)
{
return nr[0] == other.nr[0] && nr[1] == other.nr[1];
}
};
entry L[nmax+5];
int n, lg;
char a[nmax+5];
int dp[maxlg][nmax+5];
bool cmp(entry a, entry b)
{
return a.nr[0] < b.nr[0] || (a.nr[0] == b.nr[0] && a.nr[1] < b.nr[1]);
}
int lcp(int x, int y)
{
int ans = 0;
if(x==y)return n-x;
for(int k=lg-1; k>=0 && x<n && y<n; k --)
if(dp[k][x] == dp[k][y])
{
x+=1<<k;
y+=1<<k;
ans+=1<<k;
}
return ans;
}
int main()
{
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
int k;
scanf("%d%d", &n, &k);
scanf("%s", a);
for(int i=0; i<n; i++)
dp[0][i] = a[i]-'a';
for(int k=1; (1<<(k-1)) < n; k++)
{
lg = k;
for(int i=0; i<n; i++)
{
L[i].nr[0] = dp[k-1][i];
if(i+(1<<(k-1)) < n)L[i].nr[1] = dp[k-1][i+(1<<(k-1))];
else L[i].nr[1] = -1;
L[i].pos = i;
}
sort(L, L + n, cmp);
for(int i=0; i<n; i++)
{
if(i>0 && L[i] == L[i-1]) dp[k][L[i].pos] = dp[k][L[i-1].pos];
else dp[k][L[i].pos] = i;
}
}
int Max = -1;
for(int i=0; i<=n-k; i++)
Max = max(Max, lcp(L[i].pos, L[i+k-1].pos));
printf("%d\n", Max);
return 0;
}