Pagini recente » Cod sursa (job #810142) | Cod sursa (job #2935567) | Cod sursa (job #1054205) | Cod sursa (job #1912501) | Cod sursa (job #1419768)
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
ifstream F("substr.in");
ofstream G("substr.out");
const int N = 20010;
const int L = 16;
int n,k,l,dp[L][N];
char c[N];
struct tup {
int x,y,p;
};
bool cmp(tup a,tup b)
{
return a.x == b.x ? a.y < b.y : a.x < b.x;
}
bool cmp2(int a,int b)
{
return dp[l][a] < dp[l][b];
}
tup a[N];
void compute()
{
for (int i=1;i<=n;++i)
dp[0][i] = c[i] - 'a';
l = 1;
for (int ln=1;ln<=n;ln*=2,++l)
{
for (int i=1;i<=n;++i)
{
a[i].p = i;
a[i].x = dp[l-1][i];
a[i].y = i+ln >= n ? 0 : dp[l-1][i+ln];
}
sort(a+1,a+n+1,cmp);
int vl = -1;
a[0].x = -100000;
for (int i=1;i<=n;++i)
{
if ( a[i].x != a[i-1].x || a[i].y != a[i-1].y ) ++vl;
dp[l][a[i].p] = vl;
}
}
--l;
}
void print()
{
for (int i=1;i<=n;++i)
cerr<<c[i]<<' ';
cerr<<'\n';
for (int i=0;i<=l;++i)
{
for (int j=1;j<=n;++j)
cerr<<dp[i][j]<<' ';
cerr<<'\n';
}
}
int lcp(int x,int y)
{
int ans = 0;
for (int i=l;i>=0;--i)
{
if ( x + (1<<i) - 1 > n ) continue;
if ( y + (1<<i) - 1 > n ) continue;
if ( dp[i][x] == dp[i][y] )
{
ans += (1<<i);
x += (1<<i);
y += (1<<i);
}
}
return ans;
}
int p[N];
int main()
{
F>>n>>k;
F>>(c+1);
compute();
//print();
for (int i=1;i<=n;++i)
p[i] = i;
sort(p+1,p+n+1,cmp2);
int ans = 0;
for (int i=1,j=k;j<=n;++i,++j)
ans = max(ans,lcp(p[i],p[j]));
G<<ans<<'\n';
}