Pagini recente » Cod sursa (job #3295859) | Cod sursa (job #1929305) | Cod sursa (job #3269024) | Cod sursa (job #634139) | Cod sursa (job #3300295)
#include <fstream>
#include <algorithm>
#include <deque>
#define dim 100000
using namespace std;
ifstream fin ("substr.in");
ofstream fout ("substr.out");
int n,k,e,lg,ord[16][dim+1],p[dim+1],nr[dim+1],v[dim+1];
char s[dim+2];
deque <int> d;
bool cmp (int a,int b)
{
if (ord[e][a]==ord[e][b])
{
a+=lg,b+=lg;
if (a>=n||b>=n)
return a>b;
return ord[e][a]<ord[e][b];
}
return ord[e][a]<ord[e][b];
}
void suff ()
{
for (int i=0; i<n; i++)
{
ord[0][i]=s[i]-'a';
p[i]=i;
}
for (e=0; (1<<e)<=n; e++)
{
lg=(1<<e);
sort (p,p+n,cmp);
for (int i=0; i<n; i++)
nr[i]=nr[i-1]+cmp (p[i-1],p[i]);
for (int i=0; i<n; i++)
ord[e+1][p[i]]=nr[i];
}
}
int calc_pref (int a,int b)
{
int sol=0;
for (int bit=14; bit>=0; bit--)
{
if (a+(1<<bit)-1<n&&b+(1<<bit)-1<n&&ord[bit][a]==ord[bit][b])
sol+=(1<<bit),a+=(1<<bit),b+=(1<<bit);
}
return sol;
}
void solve ()
{
int sol=0;
for (int i=0; i+k<n; i++)
sol=max (sol,calc_pref (p[i],p[i+k]));
fout<<sol;
}
int main ()
{
fin>>n>>k>>s;
if (k==1)
{
fout<<n;
return 0;
}
k--;
suff ();
solve ();
return 0;
}