Pagini recente » Cod sursa (job #2667987) | Cod sursa (job #1865892) | Cod sursa (job #2425054) | Cod sursa (job #2619465) | Cod sursa (job #1022653)
#include<fstream>
#include<algorithm>
#define N 17000
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
int i,n,j,k,l,sol,put,p[20][N],poz[N];
char s[N];
struct triplet{int a,b,poz;}v[N];
inline bool cmp1(int a,int b)
{
return p[l][a]<p[l][b];
}
inline bool cmp(triplet a,triplet b)
{
if(a.a==b.a)
return a.b<b.b;
return a.a<b.a;
}
inline int lcp(int x,int y)
{
if(x==y)
return n-x;
int k=l,rez=0;
while(k>=0&&x<n&&y<n)
{
if(p[k][x]==p[k][y])
{
rez+=(1<<k);
x+=(1<<k);
y+=(1<<k);
}
--k;
}
return rez;
}
int main()
{
f>>n>>k;
f.get();
f>>s;
for(i=0;i<n;++i)
p[0][i]=s[i]-'a';
for(l=1,put=1;(put>>1)<n;++l,put<<=1)
{
for(i=0;i<n;++i)
{
v[i].a=p[l-1][i];
v[i].b=-1;
if(i+put<n)
v[i].b=p[l-1][i+put];
v[i].poz=i;
}
sort(v,v+n,cmp);
for(i=0;i<n;++i)
{
p[l][v[i].poz]=i;
if(i>0&&v[i-1].a==v[i].a&&v[i-1].b==v[i].b)
p[l][v[i].poz]=p[l][v[i-1].poz];
}
}
--l;
for(i=0;i<n;++i)
poz[i]=i;
sort(poz,poz+n,cmp1);
for(i=k-1,j=0;i<n;++i,++j)
sol=max(sol,lcp(poz[i],poz[j]));
g<<sol<<'\n';
return 0;
}